我收到这个错误,网上搜索也没有解决,所以这是我的代码^^:
void addSoggetto(char* s)
{
soggetti_length++;
if(realloc(soggetti, soggetti_length*sizeof(int))==NULL)
{
printf("Realloc Failed");
return;
}
基本上我有一个指针数组 (soggetti
) 及其长度 (soggetti_length
)。
每次运行此函数时,我都会重新分配大小以为另一个指针腾出空间。
问题是,恰好第五次调用该函数时,我得到:
realloc(): invalid next size
你知道我该怎么做吗? 我想我可以排除我重新分配的内存不够,我试着增加它但没有任何变化。 哦,我用 gdb 调试了它,函数在返回之前崩溃了,所以我什至没有得到 NULL 返回之类的东西。
最佳答案
阅读 realloc()
的联机帮助页。 realloc()
返回指向新分配的指针,它不会更改您作为参数传递的旧指针。 (不能,因为 C 使用按值传递,而不是按引用传递)。所以
if(realloc(soggetti, soggetti_length*sizeof(int))==NULL)
是内存泄漏(而且是错误的)。你需要这样的东西:
if(sogetti = realloc(soggetti, soggetti_length*sizeof(int)))
但在这种情况下,分配失败也会泄漏内存。所以,为了安全起见,你可以这样做:
void *newpointer;
if(newpointer = realloc(soggetti, soggetti_length*sizeof(int)))
{
sogetti = newpointer;
}
else
{
//handle out-of-memory
}
通过您的其余代码,我们可以看到另一个问题:
Soggetto* new = malloc(sizeof(Soggetto));
...
soggetti[soggetti_length-1]= new;
您已经为每个 sogetto_length
分配了 int
的内存 (sizeof(int)
),但是您存储的是 64 位Sogetto *
。这会通过覆盖内存中的元数据来破坏堆(因此 invalid next size
,堆数据结构的 size
部分被覆盖)。
写
void *newpointer;
if(newpointer = realloc(soggetti, soggetti_length*sizeof(Sogetto *))) //here!
{
sogetti = newpointer;
}
else
{
//handle out-of-memory
}
正确处理这个问题。
要查找此类错误,我建议使用 valgrind
、address sanitizer
。
关于c重新分配(): invalid next size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393193/