进程退出并返回值3221226356

时间:2014-09-23 05:53:57

标签: c return-value

每当我运行以下代码,并将输入作为长字符串时,它将以返回值退出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);
}

3 个答案:

答案 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)

此代码存在很多问题:

  1. 您投射malloc的结果,这是不必要的
  2. 你总是只用realloc重新分配1个字节,但即使这样,你也不会对realloc的返回值(这是一个调整大小的指针)做任何事情,所以这里没有任何用处< / LI>
  3. 由于你总是为input分配1个字节,你试图访问这个分配之外的内存,这将返回垃圾(如果你很幸运,不会出现seg错误)
  4. 阅读mallocrealloc的文档,找出代码出错的位置。

答案 2 :(得分:1)

退出代码0xC0000374是检测到堆损坏时返回的值。

在重新分配的位置,您不会重新分配更多值。你释放1个char值的内存,然后分配一个新的1 char内存段。这会导致input[i++]访问您分配区域之外的区域。