Первые два значения массива списков становятся NULL, когда я расширяю массив

У меня есть массив списков, размер которых я хочу удвоить. Я использую realloc, и когда я начинаю заполнять новые элементы массива, начальные элементы начинают становиться NULL, и я не могу изменить их значение.

int x;
Heads=realloc(Heads, TABLESIZE * sizeof(struct HTLink));
S=realloc(S, TABLESIZE * sizeof(HTHash));
for(x=TABLESIZE;x<TABLESIZE*2;x++)
{
    S[x]=(HTNode *)malloc(sizeof(HTNode));
    S[x]->Key=EmptyKey;
    S[x]->Next=NULL;
    Heads[x]=*S[x];
}
TABLESIZE*=2;
return S;

После запуска этого кода значения S[2] и выше являются нормальными, но S[0] и S[1] равны NULL.


person Benedict Dhm    schedule 18.05.2019    source источник
comment
Перейдите на минимально воспроизводимый пример.   -  person Yunnosch    schedule 18.05.2019
comment
Если вы выделяете только TABLESIZE элементов, то обращение ко всему, что находится за пределами x[TABLESIZE-1], является неопределенным поведением.   -  person Paul Ogilvie    schedule 18.05.2019
comment
Возможно, вы имели в виду S=realloc(S, 2 * TABLESIZE * sizeof(HTHash)); вместо этого?   -  person Retired Ninja    schedule 18.05.2019
comment
Не упускайте из виду тот факт, что адреса ссылок внутри данных становятся недействительными, если realloc перемещает блок памяти. Если связанные элементы фактически находятся в непрерывном массиве, вы можете использовать значения индекса массива в качестве ссылок вместо их адресов.   -  person Weather Vane    schedule 18.05.2019
comment
@RetiredNinja Это решило проблему. Спасибо.   -  person Benedict Dhm    schedule 18.05.2019


Ответы (1)


Вы не понимаете, что такое второй аргумент realloc:

void* realloc (void* ptr, size_t size);

size: Новый размер блока памяти в байтах.

Вы делаете это:

S=realloc(S, TABLESIZE * sizeof(HTHash));
for(x = TABLESIZE; x < TABLESIZE * 2; x++)

что показывает, что вы думаете, что realloc() расширит размер массива вторым параметром. Измените его на:

S=realloc(S, 2 * TABLESIZE * sizeof(HTHash));
person gsamaras    schedule 18.05.2019