You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理这段C代码的Runtime Error?求错误原因与解决方法

运行时错误原因分析及解决方法

问题描述

运行以下C代码时出现Runtime Error,删除第16、17行后错误不再出现,需明确错误原因并解决。

原代码

#include <stdio.h>

void sort(int *p, int);

int main()
{
    int *p;
    int n, k, ni = 0;
    
    scanf("%d %d", &n, &k);
    
    for (int j = 0; j < n; j++)
         scanf("%d", p + j);
    
    sort(p, n);
    
    for (int i = 0; i < n; i++)  //line 16
        if (*(p + i) != 0 && *(p + i) >= *(p + k - 1))  //line 17
            ni++;
    
    printf("%d", ni);
    
    return 0;
}

void sort(int *p, int n)
{
    for (int i = 0; i < n; i++)
    {
        int *max = p + i;
        
        for (int j = i; j < n; j++)
            if (*(p + j) > *max)
                max = p + j;
        
        int c = *(p + i);
        *(p + i) = *max ;
        *max = c;
    }
}

错误原因

核心问题是指针p未分配有效内存:

  • 代码里只声明了int *p;,但这个指针没有指向任何合法的内存空间,属于野指针。
  • 执行scanf("%d", p + j);时,程序尝试往野指针指向的非法内存地址写入数据,这已经触发了未定义行为——此时程序可能暂时没崩溃,但内存访问已经违规。
  • 第16、17行的循环中,程序继续对*(p + i)和*(p + k - 1)进行读写,进一步触发了内存访问冲突,直接导致运行时错误。删除这两行后,前面的非法内存写入可能没触发崩溃,但问题依然存在,只是没表现出来而已。

解决方法

需要给指针p分配足够的内存,可通过malloc实现:

  1. 在读取n和k之后,添加内存分配代码,同时检查分配是否成功:
p = (int*)malloc(n * sizeof(int));
if (p == NULL) {
    printf("内存分配失败\n");
    return 1;
}
  1. 程序结束前释放已分配的内存,避免内存泄漏:
free(p);

修改后的完整代码示例:

#include <stdio.h>
#include <stdlib.h> // 引入malloc和free所需的头文件

void sort(int *p, int);

int main()
{
    int *p;
    int n, k, ni = 0;
    
    scanf("%d %d", &n, &k);
    
    // 分配内存并检查
    p = (int*)malloc(n * sizeof(int));
    if (p == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    
    for (int j = 0; j < n; j++)
         scanf("%d", p + j);
    
    sort(p, n);
    
    for (int i = 0; i < n; i++)
        if (*(p + i) != 0 && *(p + i) >= *(p + k - 1))
            ni++;
    
    printf("%d", ni);
    
    // 释放内存
    free(p);
    
    return 0;
}

void sort(int *p, int n)
{
    for (int i = 0; i < n; i++)
    {
        int *max = p + i;
        
        for (int j = i; j < n; j++)
            if (*(p + j) > *max)
                max = p + j;
        
        int c = *(p + i);
        *(p + i) = *max ;
        *max = c;
    }
}

内容的提问来源于stack exchange,提问作者amir headayati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:18:30