c重新分配(): invalid next size

标签 c pointers null size realloc

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

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/

相关文章:

c - 我在 ncurses 中的窗口不显示任何内容

c - printLongestLine 打印无关信息

c - 输入文本文件的结果 int 值不存储在数组中。 C语言

c - 将数组的值赋给指针

c++ - 什么时候释放内存?

java - BrowserFactory.spawnMozilla() 返回 null

objective-c - 在 C 中使用 char,指针问题, Objective-C

c - 当您在 C 语言中声明参数数量错误的回调时会发生什么?

groovy - 在这种情况下,为什么我在 Groovy 中没有得到 NullPointerException?

mysql - SQL : Show search parameter in result, 即使结果为空