c realloc(): 无效的下一个大小

3
我遇到了这个错误,搜索在线资料并没有解决它,所以,这是我的代码^^:
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返回这样的东西。


提供一个可编译的示例会更有帮助。你的代码没有声明所使用的变量,并且包含了比 } 更多的 { - Pascal Cuoq
整数和指针是32位的,但是你说得对,这样做更好...尽管我说过,那不是解决方案,即使我分配100个字节来存储其中的4个,错误仍然存在。 - Ryno
抱歉,Pascal,但代码分为多个文件,重要的部分就是其中一个...在函数的第二部分,我分配了一个对象并将其指针存储在我刚刚重新分配的数组位置上。 - Ryno
2个回答

9

请阅读 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地址消毒剂来发现此类错误。

我正要说同样的话。这里有一个例子,基本上做了OP想要的事情:http://www.cplusplus.com/reference/cstdlib/realloc/ - Ultimate Gobblement
我觉得你就是挖到了宝藏啊,兄弟^^ 我现在就去试试,感觉很不错^^ - Ryno
@user3578051,sogetti_length是什么?一个全局变量吗?您能发布修改后的代码,包括所有相关的变量声明吗? - EOF

0

好的,这是修改后的代码,在realloc的第五次调用时出现了与之前相同的错误:

*soggetti_length是定义数组长度的全局变量。

void addSoggetto(char* s)
{

soggetti_length++;
void *newpointer;
if(newpointer = realloc(soggetti, soggetti_length*sizeof(int)))
{
    soggetti = newpointer;
printf("%p  ",soggetti);
}
else
{
    printf("REALLOC FAILED");
return;
}
Soggetto* new = malloc(sizeof(Soggetto));


new->codice = s;
new->numero_contatti=0;
new->array_contatti = malloc(0);
soggetti[soggetti_length-1]= new;

}

我刚刚注意到,如果我使用-m32编译一切都正常,这是一个64位的问题...有人能解释一下吗? - Ryno
对于您最初的问题,有一条评论回答说:您正在分配int,但编写的是Sogetto *。在64位系统中,64位进程中指针为64位 - EOF
是的,我知道,我也试过了(我尝试了sizeof(int)*2),仍然不起作用,而且仍然没有解释为什么第五次运行会崩溃...好吧,现在只是一种好奇心,我可以编译成32位。 - Ryno
我也遇到了完全相同的问题,甚至使用-m32也没有起作用。 - Fabi0_Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接