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

计算动态编辑距离程序触发Segmentation Fault(核心转储)求助

排查C语言程序内层循环触发Segmentation Fault的问题

看起来你遇到了典型的内存访问越界问题——毕竟第一次内层循环就崩,大概率是数组/指针访问超出了分配的内存范围。结合你给出的代码片段和已知条件,我整理几个最可能的排查方向:

1. 内存分配的边界与有效性问题

你定义了#define DICTIONARY_SIZE 1000000,这意味着要容纳100万个字符串指针,内存开销不小:

  • 先检查read_dictionary的内存分配逻辑:它是否用了malloc(DICTIONARY_SIZE * sizeof(char*))来分配指针数组?如果是,一定要确认分配是否成功——必须判断返回值,比如:
    char** dictionary = malloc(DICTIONARY_SIZE * sizeof(char*));
    if (dictionary == NULL) {
        perror("Failed to allocate dictionary array");
        exit(EXIT_FAILURE);
    }
    
    如果内存不足导致分配失败,后续访问dictionary[j]就是在操作无效内存,直接触发段错误。
  • 同样,QUOTE_SIZE设为100,要确认read_quote返回的quote数组确实能容纳correctme.txt里的所有单词,如果实际单词数超过100,quote数组越界会破坏栈/堆结构,间接导致后续内层循环崩溃。

2. 字符串指针的有效性问题

不管是quote还是dictionary里的单个字符串指针,如果存在NULL或者指向已释放/无效内存的情况,当dynamic_edit_distance尝试访问字符串字符时,会直接触发段错误:

  • 在进入循环前,加简单的校验逻辑:遍历quote数组,打印每个指针的地址和对应字符串内容,确认没有无效指针;对dictionary可以先检查前几十/几百个元素(毕竟100万个太多)。
  • 确认read_quote和read_dictionary在读取每个单词时,是否正确为单个字符串分配了内存,有没有出现分配失败却返回空指针的情况。

3. 内层循环的遍历边界错误

你代码里的内层循环用j作为索引,但如果j的遍历上限是硬编码的DICTIONARY_SIZE,而read_dictionary实际读取的单词数量远小于这个值,那访问dictionary[j](当j超过实际单词数时)就是在操作未初始化的垃圾指针,必然崩溃:

  • 建议修改read_dictionary函数,让它返回实际读取的单词数量,比如通过指针参数传递:
    char** read_dictionary(const char* filename, size_t* out_word_count) {
        // ... 读取逻辑 ...
        *out_word_count = actual_count;
        return dictionary;
    }
    
    这样内层循环就能用实际的单词数作为上限,而不是盲目遍历到DICTIONARY_SIZE。

4. dynamic_edit_distance的栈溢出问题

如果dynamic_edit_distance函数内部在栈上分配了大尺寸的数组(比如用二维数组存储编辑距离的中间结果,且单词长度较长),第一次调用时就可能触发栈溢出,表现为段错误:

  • 检查该函数的实现,如果有类似int dp[500][500];的栈上数组定义,改成用malloc在堆上分配内存会更安全,用完记得释放。

调试小技巧

编译时加上-g参数生成调试信息,然后用GDB运行程序:

gdb ./your_program
run
# 遇到段错误后输入
bt

bt命令会打印调用栈,能精准定位到触发段错误的代码行,帮你快速锁定问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:06:58