当我使用free()时,C中的程序随机崩溃

品牌5i2g

该程序应允许用户输入所需数量的变量(存储在数组中)。用户输入“ -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;
}
dbush

崩溃的原因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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我尝试对指针数组中的数组进行free()时,程序在特定值上崩溃

当我尝试使用 .txt 文件时,.exe 程序崩溃

C++ - 当我使用 sprintf() 函数时程序崩溃(std::cout 工作正常)

当我多次运行程序(在C中)时,它总是选择相同的随机数

函数中的 Free() 函数使我的整个程序在 c 中崩溃

当我尝试将结构中的char *类型的元素设置为特定字符串时,C程序崩溃?

当我在按下选择按钮之前没有选择列表中的项目时,C# 程序崩溃

当我使用TabLayout时,我的Android Studio应用程序崩溃,该如何解决?

当我使用反应路由重新加载具体页面时,我的应用程序崩溃了

JSQMessages:当我使用照片消息时,我的应用程序不断崩溃

当我点击注销时,我的应用程序崩溃

C#。当我尝试检查用户是否存在于我的 SQL 数据库中时,我的 Windows 窗体应用程序崩溃

当我在模拟器中运行它时,应用程序不断崩溃

当我从EditText中删除所有内容时,为什么应用程序崩溃?

当我在可可webview中重新加载URL时,应用程序崩溃了

当我尝试更新onPostExecute(...)方法中的字段时,Android应用程序崩溃

当我在真实设备 iOS 中运行它时应用程序崩溃

当我单击其他片段中的搜索按钮时,应用程序崩溃

当我在项目应用程序中安装并链接 react-native-admob 在加载时崩溃

当我关闭cmd时,Heroku中的Node.js应用程序崩溃

当我尝试在pyqt5程序中运行语音识别时崩溃

当我触摸UITableView中的特定单元格时,应用程序崩溃

当我单击列表中的歌曲时应用程序崩溃

为什么当我按下按钮在表中插入值时应用程序崩溃?

当我将文本框保留为空时如何防止程序崩溃c#

当我转到主屏幕时,使用Facebook Login SDK的应用程序崩溃

当我添加使用MediaPlayer类运行音频的方法时,为什么应用程序崩溃?

当我使用countdowntimer切换选项卡(片段)时,应用程序崩溃

为什么当我尝试在 for 循环中使用 strcat() 时程序崩溃?