如何处理这段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实现:
- 在读取
n和k之后,添加内存分配代码,同时检查分配是否成功:
p = (int*)malloc(n * sizeof(int)); if (p == NULL) { printf("内存分配失败\n"); return 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
相关产品推荐
相关产品推荐

