我正在尝试创建一个动态数组,它使用双指针将动态二维数组中给定句子的单词存储起来,但每当我提供三个以上的单词时,我都会收到以下错误:
*** 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来增加句子的大小,但仍然没有找到任何可靠的解决方案。提前谢谢。
答案 0 :(得分:2)
此代码
ptr=malloc(ptrsize*sizeof(char *));
ptr[ptrsize]=(char *)malloc(wordsize*sizeof(char));
以后在循环体中重复的相似行不正确。
像
这样的数组Type* ptr = malloc(N * sizeof(Type));
包含从0
到N - 1
的有效索引。 ptr[N]
总是会超过数组的末尾。写入此内存和/或重新分配它可能最终会破坏堆数据结构。