该程序应允许用户输入所需数量的变量(存储在数组中)。用户输入“ -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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句