【问题标题】:glibc detected: realloc(): invalid next size检测到 glibc:realloc():下一个大小无效
【发布时间】:2013-01-04 02:22:46
【问题描述】:

我正在尝试创建一个动态数组,该数组使用双指针将给定句子的单词存储在动态二维数组中,但是每当我给出三个以上的单词时,都会出现以下错误:

*** glibc detected *** ./a.out: realloc(): invalid next size: 0x000000000255a030 ***

相关代码如下:

#include <stdio.h>
#include <stdlib.h>  
int main()  
{
    char **ptr=NULL;  
    char letter;    
    int ptrsize=1, wordsize=1;  
    ptr=malloc(ptrsize*sizeof(char *));
    ptr[ptrsize]=(char *)malloc(wordsize*sizeof(char));
    do
    {
            letter=getchar();
            while ((letter!=' ')&&(letter!='\n'))
            {
                    ptr[ptrsize][wordsize]=letter;
                    *ptr= realloc(*ptr,wordsize+1);
                    wordsize++;
                    letter=getchar();
            }
            ptrsize++;
            ptr = realloc(ptr,ptrsize*sizeof(char));
            wordsize=1;
            ptr[ptrsize]=malloc(wordsize*sizeof(char));
    }
    while (letter!='\n');
    return 0;
}

我已经设法通过更改双指针的 malloc 和 realloc 来增加句子的大小,但仍然没有找到任何可靠的解决方案。提前致谢。

【问题讨论】:

标签: c glibc realloc


【解决方案1】:

这段代码

 ptr=malloc(ptrsize*sizeof(char *));
 ptr[ptrsize]=(char *)malloc(wordsize*sizeof(char));

并且循环体后面重复的类似行是不正确的。

类似的数组

Type* ptr = malloc(N * sizeof(Type));

具有从0N - 1 的有效索引。 ptr[N] 总是会超过数组的末尾。写入此内存和/或重新分配它可能最终会破坏堆数据结构。

【讨论】:

  • 这行:int ptrsize=1, wordsize=1; 是否解决了问题?由于第一个值为 1,那么数组是否没有从 1 到 N 的有效索引?
  • 没有。它们总是从 0 开始。
  • 我更正了初始化和大小,现在它工作正常。非常感谢!
猜你喜欢
  • 2015-05-23
  • 2012-02-22
  • 1970-01-01
  • 2012-08-09
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多