每当我运行以下代码,并将输入作为长字符串时,它将以返回值退出3221226356
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i=0;
char c,*input;
input=(char *)malloc(sizeof(char));
if(input==NULL)
{
printf("Could not allocate memory");
exit(1);
}
printf("%d size",strlen(input));
printf("Enter the string: ");
while((c=getchar())!='\n')
{
realloc(input, (sizeof(char)));
input[i++]=c;
}
printf("%s",input);
}
答案 0 :(得分:6)
realloc
函数返回 新 指针。它不会改变你传递给它的指针。
这意味着在第一次调用realloc
之后,你可能开始写入未分配的内存,导致undefined behavior。
另请注意,您的realloc
调用仅分配一个字节。您需要分配以前的尺寸 plus 一个。
还有一个问题是你在指向未初始化内存的指针上调用strlen
(顺便说一下大小为1),也会导致未定义的行为。
由于您将分配的内存视为字符串,因此您还应为字符串终结符分配空间,因此第一次分配应该是两个字节。
另外两个注释:sizeof(char)
被指定为始终导致1
。在C don't cast the result of malloc
(and family)。
答案 1 :(得分:2)
此代码存在很多问题:
malloc
的结果,这是不必要的realloc
重新分配1个字节,但即使这样,你也不会对realloc
的返回值(这是一个调整大小的指针)做任何事情,所以这里没有任何用处< / LI>
input
分配1个字节,你试图访问这个分配之外的内存,这将返回垃圾(如果你很幸运,不会出现seg错误)阅读malloc
和realloc
的文档,找出代码出错的位置。
答案 2 :(得分:1)
退出代码0xC0000374
是检测到堆损坏时返回的值。
在重新分配的位置,您不会重新分配更多值。你释放1个char值的内存,然后分配一个新的1 char内存段。这会导致input[i++]
访问您分配区域之外的区域。