计算动态编辑距离程序触发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
相关产品推荐
相关产品推荐

