MacBook M1芯片运行C代码出现Segmentation fault 11错误求助
Segmentation fault 11 问题排查与修复(M1 MacBook环境)
你的代码出现Segmentation fault 11的核心原因并非M1芯片或VSCode设置问题,而是文件操作未做错误检查,同时存在其他潜在内存风险,以下是具体分析和修复方案:
直接触发段错误的原因:文件打开失败未处理
在main函数中,你调用fopen("farmacie.txt", "r")打开文件,但没有检查返回值。如果文件不存在、路径错误或无读取权限,fopen会返回NULL。后续将NULL传入citireFisier函数并执行fscanf,会直接导致空指针访问,触发段错误。
其他潜在问题
- 所有
malloc调用未检查返回值:如果内存分配失败,malloc返回NULL,后续对denumire或salarii的操作也会引发段错误。 - 未释放动态分配的内存:代码中多处使用
malloc但没有对应的free,会造成内存泄漏。
修复方案
1. 添加文件打开检查
在main中添加判断,确保文件成功打开:
int main() { FILE *file = fopen("farmacie.txt", "r"); // 检查文件是否成功打开 if (file == NULL) { perror("无法打开文件"); exit(EXIT_FAILURE); } struct Farmacie fis = citireFisier(file); afisareFarmacie(fis); // 释放动态分配的内存,避免泄漏 free(fis.denumire); free(fis.salarii); fclose(file); // 关闭文件 }
2. 为所有malloc添加错误检查
以initializare函数为例,修改后:
struct Farmacie initializare(const char *denumire, int nr_angajati, float *salarii, int an_infiintare) { struct Farmacie f; f.nr_angajati = nr_angajati; f.an_infiintare = an_infiintare; f.denumire = malloc((strlen(denumire) + 1) * sizeof(char)); if (f.denumire == NULL) { perror("分配denumire内存失败"); exit(EXIT_FAILURE); } strcpy(f.denumire, denumire); f.salarii = malloc(sizeof(float) * nr_angajati); if (f.salarii == NULL) { perror("分配salarii内存失败"); free(f.denumire); // 已分配的内存要释放 exit(EXIT_FAILURE); } for (int i = 0; i < nr_angajati; i++) { f.salarii[i] = salarii[i]; } return f; }
同理,copiere和citireFisier函数中的malloc都需要添加类似检查。
3. 确保文件路径正确
- 如果使用VSCode运行,确认
farmacie.txt位于当前工作目录(可通过终端执行pwd查看当前路径,将文件放在该目录下)。 - 也可以使用绝对路径,比如
fopen("/Users/你的用户名/Desktop/farmacie.txt", "r")。
测试建议
- 创建符合格式的
farmacie.txt文件,示例内容:
FarmacieCentrala 3 4500.50 3800.00 5200.75 2005
- 编译时建议添加警告参数,比如
gcc -Wall -Wextra your_code.c -o farmacie,帮助提前发现潜在问题。
内容的提问来源于stack exchange,提问作者Cojo
相关产品推荐
相关产品推荐

