[英]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.