【问题标题】:c realloc(): invalid next sizec realloc():下一个大小无效
【发布时间】:2014-10-13 03:08:12
【问题描述】:

我收到此错误,在线搜索并没有解决,这是我的代码^^:

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 的返回

【问题讨论】:

  • 一个可编译的例子会有所帮助。你的没有声明它使用的变量并且包含更多的{而不是}
  • int 和指针是 32 位的,但是是的,你是对的,它更好......虽然正如我所说,这不是解决方案,即使我分配 100 个字节来存储其中的 4 个,错误是一样的
  • 对不起pascal,但是代码被分成了更多的文件,重要的部分是一个......在函数的第二部分我分配了一个对象并将他的指针存储在我刚刚的位置在数组上重新分配

标签: c pointers null size realloc


【解决方案1】:

阅读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 sizesize 部分被覆盖)。

void *newpointer;
if(newpointer = realloc(soggetti, soggetti_length*sizeof(Sogetto *))) //here!
    {
        sogetti = newpointer;
    }
else
    {
        //handle out-of-memory
    }

正确处理这个问题。 要找到这样的错误,我推荐valgrindaddress sanitizer

【讨论】:

  • 我正要说同样的话。有一个例子或多或少地做了 OP 想要的:cplusplus.com/reference/cstdlib/realloc
  • 我认为你只是挖金人^^我现在就去尝试,但感觉不错^^
  • @user3578051 sogetti_length 是什么?全局变量?您能否发布修改后的代码,包括所有相关的变量声明?
【解决方案2】:

好的,这是修改后的代码,和之前第五次调用 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 编译一切都可以 O.o 这是一个 64 位问题...有人可以解释一下吗?
  • 对原始问题的评论回答:您分配的是ints,但写的是Sogetto *s。在 64 位系统上,在 64 位进程中,指针是 64 位
  • 是的,我知道,我也试过了(我放了 sizeof(int)*2),仍然无法正常工作,并且仍然没有解释为什么它在第五次运行时崩溃......现在只是好奇,我可以在 32 位编译
  • 我有同样的问题,甚至没有使用 -m32 作品
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2016-03-19
  • 2018-06-13
  • 2011-02-25
相关资源
最近更新 更多