2014-09-23 3002 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的文檔,找出您的代碼出錯的位置。