добавить к динамически распределенному массиву в c - PullRequest
1 голос
/ 01 ноября 2010

Я пробую realloc, но это не сработало

это код. спасибо за вашу помощь

trial = malloc (4 * sizeof(int));

trial[0] = 1; trial[1] = 4;trial[2] = 7;trial[3] = 11;

trial = (int*)realloc(trial, sizeof(int) * 5);
trial[sizeof(trial)-1] = 23;

int a;
for(a = 0; a < sizeof(trial); a++){
        printf("TRIAL %d \n", trial[a]);
}

И вывод выглядит так

TRIAL 1 
TRIAL 4 
TRIAL 7 
TRIAL 23 

должно быть

TRIAL 1 
TRIAL 4 
TRIAL 7 
TRIAL 11
TRIAL 23 

Ответы [ 5 ]

6 голосов
/ 01 ноября 2010

Проблема в том, что sizeof не говорит вам, сколько элементов в массиве;он говорит вам, сколько места занимает указатель (который указывает на первый элемент).Так что sizeof(trial) == sizeof(int*), а не количество элементов.Вам нужно хранить длину отдельно.

2 голосов
/ 01 ноября 2010

sizeof вернет sizeof (int *), который является размером указателя.Вам придется отдельно отслеживать размер указателя.

Кроме того, вы не должны возвращать realloc () указателю, который вы перераспределяете.Если realloc возвращает NULL, он не изменит указатель, и вы потеряете его.Временный указатель лучше всего использовать следующим образом:

int *p;
int *tmp;
/*...*/
tmp = realloc(p, NEW_SIZE);
if (tmp != NULL) p = tmp;
else { /*...*/ }
2 голосов
/ 01 ноября 2010

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

1 голос
/ 01 ноября 2010

sizeof(trial) == постоянная (вероятно, 4 или 8).Это не будет количеством выделенных вами элементов.

Вам нужно что-то вроде

int n = 100;
trial = realloc(trial, n*sizeof(*trial));

trial[n-1] = K;  // K is some number.
1 голос
/ 01 ноября 2010

sizeof возвращает размер типа, в этом случае размер целого *, который я предполагаю, составляет 4 байта.Итак, вы делаете размер массива 5, но вы устанавливаете элемент (4 - 1) равным 23. Вам нужно отслеживать размер массива через переменную.

...