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

C语言程序运行触发Segmentation Fault,求错误排查与解决方法

排查C语言程序中的Segmentation Fault问题

你的代码存在多个问题,其中main函数参数错误是直接触发段错误的核心原因,以下是逐一排查和修复方案:

1. main函数参数定义错误(直接导致段错误)

标准C语言的main函数签名为int main(int argc, char **argv),你错误地定义为int main(int argc, char **dict, char **jambles)。C语言中命令行参数只会通过argv数组传递,你自定义的dict和jambles并非合法的参数数组,访问dict[1]、jambles[1]时会直接访问非法内存,触发段错误。

修复代码:

int main(int argc, char **argv)
{
    // 先检查命令行参数数量是否足够
    if (argc < 3) {
        fprintf(stderr, "用法: %s <乱序单词文件路径> <字典文件路径>\n", argv[0]);
        return 1;
    }
    const char *j = argv[1];
    FILE *jambles_file = fopen(j, "r");
    // ... 后续代码
}

2. 文件打开未做错误检查

如果fopen失败(比如文件不存在、权限不足),会返回NULL指针。后续用NULL调用fgets会触发段错误,必须检查文件是否成功打开。

修复代码:

FILE *jambles_file = fopen(j, "r");
if (jambles_file == NULL) {
    perror("打开乱序单词文件失败");
    return 1;
}

// 内层打开字典文件时同样要检查
FILE *dict_file = fopen(d, "r");
if (dict_file == NULL) {
    perror("打开字典文件失败");
    fclose(jambles_file); // 关闭已打开的文件
    return 1;
}

3. 未关闭打开的文件(内存泄漏+潜在问题)

内层循环每次打开字典文件,但从未调用fclose(dict_file),会导致文件句柄泄漏,长时间运行可能引发系统资源耗尽问题。

修复代码:

while (fgets(dict_words, sizeof(dict_words), dict_file)) {
    // ... 内层循环逻辑
}
fclose(dict_file); // 内层循环结束后关闭字典文件

4. fgets读取的换行符干扰排序匹配

fgets会把换行符\n也读入缓冲区,strlen会将其计入长度,排序时换行符会参与排序,导致strcmp无法正确匹配(比如文件中的"abc\n"和字典中的"abc"排序后结果不同)。

修复代码:

// 处理乱序单词的换行符
size_t len = strlen(jambles_words);
if (len > 0 && jambles_words[len-1] == '\n') {
    jambles_words[len-1] = '\0';
}

// 处理字典单词的换行符
len = strlen(dict_words);
if (len > 0 && dict_words[len-1] == '\n') {
    dict_words[len-1] = '\0';
}

5. 排序修改原缓冲区,破坏原始数据

sorting函数直接修改传入的数组,导致下一次循环时jambles_words已经是排序后的状态,而非原始乱序单词,逻辑完全错误。

修复代码:

// 对乱序单词创建副本,用副本排序
char j_copy[51];
strcpy(j_copy, jambles_words);
const char *sort_jambles = sorting(j_copy, strlen(j_copy));

// 对字典单词创建副本
char d_copy[51];
strcpy(d_copy, dict_words);
const char *sort_dict = sorting(d_copy, strlen(d_copy));

6. "NO MATCHES"逻辑错误

你将else if (count == 0)放在内层循环中,每次遇到长度不匹配的单词都会打印这句话,这不符合需求。应该在内层循环结束后,统一判断是否没有匹配项。

修复代码:

// 内层循环中去掉else if(count ==0)的代码
while (fgets(dict_words, sizeof(dict_words), dict_file)) {
    // ... 匹配逻辑
}
// 内层循环结束后判断是否无匹配
if (count == 0) {
    printf("NO MATCHES\n");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:15:59