haisheer 2023-11-04 16:41 采纳率: 50%
浏览 7
已结题

关于#c##的问题:系统显示警告:局部变量 'pscor' 可能指向已取消分配的内存


#include "stdio.h"
#include "stdlib.h"
int main()
{
    int num = 10, i, max, min, sum, *pscor;
    float average;
    printf("输入第一组学生的人数:\n");
    while (scanf("%d", &num) != EOF) {
        pscor = (int *) malloc(num * sizeof(int));
        if (pscor == NULL) {
            printf("申请失败\n");
            exit(0);
        }
        printf("输入这组学生的成绩:\n");
        for (i = 0; i < num; i++)
        {
            scanf("%d", pscor + i);
            max = pscor[0];
            min = pscor[0];
            sum = pscor[0];
            for (i = 1; i < num; i++)
            {
                if (pscor[i] > max)
                    max = pscor[i];
                if (pscor[i] < min)
                    min = pscor[i];
                sum += pscor[i];
            }
            average = (float) sum / num;
            printf("--------------------------\n");
            printf("最高分:%-5d", max);
            printf("最低分:%-5d", min);
            printf("平均分:%.1f\n", average);
            free(pscor);
            printf("继续输入下一组人数:");
        }
        return 0;
    }
}

为什么运行不了,系统显示警告:局部变量 'pscor' 可能指向已取消分配的内存,怎么搞啊这
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-05 18:37
    关注

    【以下回答由 GPT 生成】

    这段代码运行不了的原因是在循环内部每次都重新分配了内存给指针 pscor,但是在每次分配内存之前没有释放之前申请的内存。这导致在循环下一次开始时,内存空间没有被释放,然后又重新分配了一块新的内存,这样就造成了内存泄漏。而且在释放内存之后又继续使用了 pscor 指针,这样就会导致指针悬挂的问题。

    解决这个问题的方法是在每次重新分配内存之前先释放之前的内存。同时,需要将循环计数器 i 的声明放在内层循环之前,防止变量覆盖。

    以下是修改后的代码:

    #include "stdio.h"
    #include "stdlib.h"
    
    int main()
    {
        int num = 10, i, max, min, sum, *pscor;
        float average;
    
        printf("输入第一组学生的人数:\n");
    
        while (scanf("%d", &num) != EOF) {
            if (pscor != NULL) {
                free(pscor);
            }
    
            pscor = (int *) malloc(num * sizeof(int));
    
            if (pscor == NULL) {
                printf("申请失败\n");
                exit(0);
            }
    
            printf("输入这组学生的成绩:\n");
    
            for (i = 0; i < num; i++) {
                scanf("%d", pscor + i);
            }
    
            max = pscor[0];
            min = pscor[0];
            sum = pscor[0];
    
            for (i = 1; i < num; i++) {
                if (pscor[i] > max)
                    max = pscor[i];
                if (pscor[i] < min)
                    min = pscor[i];
                sum += pscor[i];
            }
    
            average = (float) sum / num;
    
            printf("--------------------------\n");
            printf("最高分:%d", max);
            printf("最低分:%d", min);
            printf("平均分:%.1f\n", average);
    
            printf("继续输入下一组人数:");
        }
    
        free(pscor);
    
        return 0;
    }
    

    这个修改后的代码会在每次循环前释放之前申请的内存,并将内循环的计数器 i 的声明放在循环内部,修复了项问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 创建了问题 11月4日

悬赏问题

  • ¥20 谁刷目标页面的uv记录器上数据,数据只记录跳转的数值
  • ¥30 数据库软件的安装方法
  • ¥15 一道以太网数据传输题
  • ¥15 python 下载群辉文件
  • ¥50 代码还没怎么运行但是需要代码功能调用数据
  • ¥15 vue请求不到数据,返回状态200,数据为html
  • ¥15 用白鹭引擎开发棋牌游戏的前端为什么这么难找
  • ¥35 哪位专业人士知道这是什么原件吗?哪里可以买到?
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?