gpt4 book ai didi

c重新分配(): invalid next size

转载 作者:太空宇宙 更新时间:2023-11-04 00:49:16 25 4
gpt4 key购买 nike

我收到这个错误,网上搜索也没有解决,所以这是我的代码^^:

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
}

正确处理这个问题。要查找此类错误,我建议使用 valgrindaddress sanitizer

关于c重新分配(): invalid next size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com