簡體   English   中英

當我使用free()時C中的程序隨機崩潰

[英]Program in C randomly crashes when I use free()

該程序應該允許用戶輸入任意數量的變量(存儲在數組中)。 一旦用戶輸入“-999”,程序將停止填充數組,找到數組中的最大數字並結束。 但是,當我在程序中輸入一些測試數字時,它會有時成功結束,但有時它會決定崩潰。

例如,我可以輸入:

100 (return) 200 (return) 300 (return) 400 (return) -999 (return)

它會崩潰

然后我會輸入:

10 (return) 20 (return) 30 (return) 40 (return) -999 (return) 

它會成功運行。 然后,如果我鍵入我最初鍵入的內容,它將起作用並且不會崩潰。 我甚至會重復這個測試,它不會復制相同的結果。

我完全迷茫和失落,任何幫助將不勝感激。

#include <stdio.h>

void fillArray(int *a);
int largestElement(int *a);

int i = 0;

int main()
{
    int *array = (int *)malloc(sizeof(int));

    fillArray(array);

    printf("The largest element in 'array' is: %d\n", largestElement(array));

    //Program randomly crashes right here sometimes, not sure why.
    printf("Right before free function...\n");
    free(array);
    printf("Successfully freed!\n");

    return 0;
}

void fillArray (int *a)
{
    int userInput = 0;
    printf("Type in a list of numbers terminated by a -999:\n");

    while(userInput != -999)
    {
        //*a = realloc(a, (i+1) * sizeof(int));

        scanf("%d", &userInput);
        a[i] = userInput;
        i++;
    }
}

int largestElement(int *a)
{
    int j;
    int largest = a[0];

    for(j = 0; j < i; j++){
        if(a[j] > largest){
            largest = a[j];
        }
    }
    return largest;
}

free崩潰的原因是因為您只為單個int分配空間,但是您將值復制到a ,就像它是具有多個值的數組一樣。 寫入已分配內存的末尾就像調用未定義的行為一樣。

您已注釋掉的realloc調用並不是您想做的事情:

*a = realloc(a, (i+1) * sizeof(int));

表達式*a的類型為int ,將指針指回給它是沒有意義的。 因為realloc可以移動最初分配的內存,所以需要在main中傳遞array地址 ,以便可以在調用函數中修改它。

因此,更改fillArray以獲取指向指針的指針:

void fillArray (int **a)
{
    int userInput = 0;
    printf("Type in a list of numbers terminated by a -999:\n");

    while(userInput != -999)
    {
        *a = realloc(*a, (i+1) * sizeof(int));

        scanf("%d", &userInput);
        (*a)[i] = userInput;
        i++;
    }
}

並稱之為:

fillArray(&array);

暫無
暫無

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

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