读取文本文件整数至数组时触发Segmentation Fault问题求助
嘿,我来帮你排查这个段错误的问题!从你描述的项目需求和给出的代码片段来看,问题大概率出在内存分配、变量拼写错误或者文件读取逻辑上,咱们一步步理清楚:
首先,先抓出代码里的明显错误
你写的find_median函数里用了amtValu,但全局变量明明是amtValues——少了末尾的es!这种拼写错误会导致引用未定义的变量,很容易触发奇怪的内存问题,先把这个改过来。
核心问题:未正确给指针分配内存
你声明了全局指针int *values;,但如果在读取文件里的整数数量amtValues之后,没有用malloc给它分配足够的内存空间就直接写入数据,必然会访问非法内存,触发段错误。
正确的做法是:在读取到amtValues之后,立刻分配对应大小的内存,还要检查分配是否成功(避免内存不足的情况):
values = malloc(amtValues * sizeof(int)); if (values == NULL) { perror("内存分配失败"); exit(EXIT_FAILURE); }
文件读取的逻辑要加错误检查
读取文件时如果忽略错误处理,也可能导致后续操作访问非法内存:
- 先确保成功打开文件:
FILE *fp = fopen("测试.txt", "r"); if (fp == NULL) { perror("无法打开测试.txt文件"); exit(EXIT_FAILURE); } - 读取第一行的整数数量时,要确认读取成功:
if (fscanf(fp, "%d", &amtValues) != 1) { fprintf(stderr, "读取整数数量失败\n"); fclose(fp); exit(EXIT_FAILURE); } - 循环读取整数时,也要逐个检查读取结果,避免文件内容和声明的数量不匹配:
for (int i = 0; i < amtValues; i++) { if (fscanf(fp, "%d", &values[i]) != 1) { fprintf(stderr, "读取第%d个整数失败\n", i+1); free(values); // 记得释放已分配的内存 fclose(fp); exit(EXIT_FAILURE); } }
优化建议:尽量避免全局变量
全局变量虽然能用,但会增加调试难度,建议把amtValues和values改成主函数里的局部变量,再通过参数传递给find_median函数,代码逻辑会更清晰。
完整的修正示例代码
#include<stdio.h> #include<stdlib.h> // qsort需要的比较函数 int compare_ints(const void *a, const void *b) { return (*(int*)a - *(int*)b); } float find_median(int* values, int amtValues) { // 先排序数组 qsort(values, amtValues, sizeof(int), compare_ints); // 计算中位数 if (amtValues % 2 == 1) { return (float)values[amtValues / 2]; } else { return (values[amtValues/2 - 1] + values[amtValues/2]) / 2.0f; } } int main() { FILE *fp = fopen("测试.txt", "r"); if (fp == NULL) { perror("无法打开测试.txt"); exit(EXIT_FAILURE); } int amtValues; if (fscanf(fp, "%d", &amtValues) != 1) { fprintf(stderr, "读取整数数量失败\n"); fclose(fp); exit(EXIT_FAILURE); } int *values = malloc(amtValues * sizeof(int)); if (values == NULL) { perror("内存分配失败"); fclose(fp); exit(EXIT_FAILURE); } // 读取所有整数 for (int i = 0; i < amtValues; i++) { if (fscanf(fp, "%d", &values[i]) != 1) { fprintf(stderr, "读取第%d个整数失败\n", i+1); free(values); fclose(fp); exit(EXIT_FAILURE); } } // 计算并输出中位数 float median = find_median(values, amtValues); printf("中位数为:%.2f\n", median); // 清理资源,避免泄漏 free(values); fclose(fp); return 0; }
按照上面的步骤调整后,应该就能解决段错误的问题啦,记得用完内存和文件后一定要释放和关闭哦!
内容的提问来源于stack exchange,提问作者skulltula
相关产品推荐
相关产品推荐

