2014-09-23 3001 views
0

每当我运行下面的代码,并给输入长串它就会有返回值3221226356过程中获得退出,返回值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); 
} 
+1

realloc(input,(sizeof(char)));返回值 – 2014-09-23 06:09:31

回答

4

realloc函数返回一个新的指针。它不会更改您传递给它的指针。

这意味着在第一次致电realloc之后,您可能开始写入未分配的内存,导致undefined behavior

另请注意,您的realloc通话只分配一个字节。您需要分配以前的大小一。

还有一个问题,你调用strlen指向未初始化的内存(大小为一),其中导致未定义的行为。

而且,由于您将您分配的内存视为字符串,因此还应为字符串终止符分配空间,因此第一次分配应为两个字节。

另外一些注意事项:sizeof(char)被指定始终导致1。并在C don't cast the result of malloc (and family)

0

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

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

+2

其中,realloc的返回值被忽略,所以'input'可能无效。 – 2014-09-23 06:02:20

1

很多的问题与此代码:

  1. 你施放的malloc的结果,这是不必要的
  2. 你总是realloc重新分配只有1个字节,但即使考虑到,你什么都不做与realloc的返回值(这是一个调整大小的指针),所以没有用的发生在这里
  3. 因为你总是有一个1字节的分配input,你试图访问这个分配以外的内存,这将返回垃圾如果你足够幸运不克不及et seg故障)

阅读关于mallocrealloc的文档,找出您的代码出错的位置。