簡體   English   中英

進程退出,返回值3221226356

[英]process get exited with return value 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);
}

realloc函數返回一個新的指針。 它不會更改傳遞給它的指針。

這意味着在第一次調用realloc之后,您可能會開始寫入未分配的內存,從而導致未定義的行為

另請注意,您的realloc調用僅分配一個字節。 您需要分配以前的大小一個。

還有一個問題,即您在指向未初始化內存(順便說一下,大小為1)的指針上調用strlen ,這也會導致未定義的行為。

並且由於將分配的內存視為字符串,因此還應該為字符串終止符分配空間,因此最開始的分配應該是兩個字節。

另外兩點注意: sizeof(char)指定始終為1 並且在C中不要轉換malloc (和family)的結果

此代碼存在很多問題:

  1. 您強制轉換了malloc的結果
  2. 您始終只能使用realloc重新分配1個字節,但是即使這樣,您也不realloc的返回值(這是一個調整大小的指針)做任何事情,因此這里沒有任何有用的事情
  3. 由於您總是有一個1字節的分配input ,因此您嘗試訪問此分配之外的內存,這將返回垃圾(如果您很幸運,沒有遇到段錯誤)

閱讀有關mallocrealloc文檔,以弄清楚代碼出了什么問題。

退出代碼0xC0000374是檢測到堆損壞時返回的值。

在您重新分配的位置,您不會重新分配更多的值。 您釋放了1個字符的內存,然后分配了一個新的1個字符的內存段。 這將導致input[i++]訪問您分配的區域之外的區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM