C 当我展开数组时,列表数组的前两个值变为NULL

C 当我展开数组时,列表数组的前两个值变为NULL,c,realloc,C,Realloc,我有一个列表数组,我希望它的大小加倍。我使用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(HT

我有一个列表数组,我希望它的大小加倍。我使用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;
intx;
Heads=realloc(Heads,TABLESIZE*sizeof(struct-HTLink));
S=realloc(S,TABLESIZE*sizeof(HTHash));
for(x=TABLESIZE;xKey=EmptyKey;
S[x]->Next=NULL;
头[x]=*S[x];
}
表大小*=2;
返回S;

运行此代码后,S[2]和以上的值为正常值,但S[0]和S[1]为空

您对的第二个参数感到困惑:

void*realloc(void*ptr,size\u t size);

size
:内存块的新大小,以字节为单位

您正在这样做:

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

您对的第二个论点感到困惑:

void*realloc(void*ptr,size\u t size);

size
:内存块的新大小,以字节为单位

您正在这样做:

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

请升级到a。如果您只分配
TABLESIZE
元素,那么处理
x[TABLESIZE-1]
之外的任何内容都是未定义的行为。您的意思可能是
S=realloc(S,2*TABLESIZE*sizeof(HTHash))
相反?如果
realloc
重新定位内存块,请不要忽略以下事实:数据中的链接地址将无效。如果链接项实际上位于连续数组中,则可以将数组索引值用作链接,而不是它们的地址。@RetiredInja解决了此问题。谢谢。请升级到a。如果您只需要分配
TABLESIZE
元素,然后处理
x[TABLESIZE-1]
之外的任何内容都是未定义的行为。您的意思可能是
S=realloc(S,2*TABLESIZE*sizeof(HTHash))
相反?不要忽略这样一个事实,即如果
realloc
重新定位内存块,数据中的链接地址将无效。如果链接项实际上位于一个连续数组中,则可以将数组索引值用作链接,而不是它们的地址。@RetiredInja解决了这个问题。谢谢。