2016-07-28 4 views
-1

Я пытаюсь реализовать динамически увеличивающийся массив с realloc. Я создаю массив с malloc, а затем вызвать мою add функцию, которая увеличивает размер массива на 1. Вот код:ошибка realloc - приращение последнего элемента массива

#include <stdio.h> 
#include <stdlib.h> 

int *foo; 
int quantity; 

void add(int number) { 
    foo = (int*) realloc(foo, sizeof(foo) + sizeof(int)); 
    foo[quantity] = number; 
    quantity++; 
} 

void debugFoo() { 
    for (int i = 0; i < quantity; i++) { 
     printf("foo[%i] = %i\n", i, foo[i]); 
    } 
    printf("\n"); 
} 

int main() { 
    quantity = 3; 
    foo = (int*) malloc(quantity * sizeof(int)); 

    foo[0] = 1; 
    foo[1] = 2; 
    foo[2] = 3; 

    debugFoo(); 

    add(20); 
    debugFoo(); 
    add(2); 
    debugFoo(); 

    return 0; 
} 

Однако, когда я запускаю его, я получаю следующий результат:

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 20 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 21 
foo[4] = 2 

Как вы можете видеть, значение foo [3] увеличивается на 1 во второй раз, когда я вызываю add. И странно, что он только увеличивается, если первое значение, переданное в add, равно. Изменение линии 30 к add(21), я получаю следующий вывод:

[...] 
foo[2] = 3 
foo[3] = 21 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 21 
foo[4] = 2 

Является ли это ошибка или я использую realloc неправильно?

+0

Вам не нужно бросать результат malloc. вы можете изменить 'foo = (int *) malloc (количество * sizeof (int));' to 'foo = malloc (количество * sizeof * foo);' – sjsam

+0

[Ошибка компилятора] (http://c2.com/cgi/wiki? CompilerBug) –

ответ

5

sizeof(foo) не размер выделенного буфера, но размер foo, который является int*. Используйте накопленное количество элементов для вычисления нового размера буфера.

foo = (int*) realloc(foo, sizeof(int) * (quantity + 1)); 
+0

[Эти же идеи] (http://ideone.com/8VwKoX) – imbearr

1

sizeof(foo) возвращает вас всегда такое же значение, вероятно, 4. Из-за оператора SizeOf возвращает вам размер int *

Вы «правильно» объявили переменную глобальной области (quantity), которые хранят текущий размер ваш массив, используйте эту переменную до realloc вашей структуры, как и с malloc.

void add(int number) { 
    quantity++; 
    foo = realloc(foo, (quantity * sizeof(int))); 
    if (foo != NULL) 
    { 
     foo[quantity-1] = number; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to add number.\n"); 
    } 
} 

Обратите внимание, что очень важно всегда проверять возвращаемые значения функций. Как показано в моем примере для возвращаемого значения realloc, вы должны сделать то же самое для malloc в main функции.

int main() { 
    quantity = 3; 
    foo = malloc(quantity * sizeof(int)); 
    if (foo != NULL) 
    { 
     foo[0] = 1; 
     foo[1] = 2; 
     foo[2] = 3; 

     debugFoo(); 

     add(20); 
     debugFoo(); 
     add(2); 
     debugFoo(); 

     return 0; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to allocate array.\n"); 
     return 1; 
    } 
} 
+0

Этот код содержит ошибку. - Кажется, исправлено. – MikeCAT

+0

Так вниз, я редактирую. Мог бы позволить мне дышать ...? – LPs

+0

@MikeCAT Я плохо нажал кнопку «Опубликовать свой ответ» ... :) – LPs

 Смежные вопросы

  • Нет связанных вопросов^_^