插入排序检查顺序倒置引发SegFault段错误问题排查
问题分析与修复
段错误原因
你的插入排序出现段错误的核心问题是循环条件的判断顺序错误。原代码中循环条件写为:
for(j = i - 1; key > *A[j][k] && j >= 0; j--)
C语言的&&是短路求值运算符:只有左边表达式为真时,才会执行右边的表达式。当j递减到-1时,会先执行key > *A[j][k],此时访问A[-1][k]属于数组越界访问,直接触发段错误。
而当你把条件改成j>0时,j最小只会到0,不会出现越界访问,所以代码能运行,但同时也跳过了j=0的情况,导致首个元素无法参与排序逻辑。
修复方案
调整循环条件的判断顺序,先检查j >= 0,再进行元素比较,确保只有在j合法的情况下才访问数组元素:
void insertion_sort(int ***A, int n, int m) { int key, j; for (int k = 0; k < m; k++) for (int i = 1; i < n; i++) { key = *A[i][k]; // 先判断j的合法性,再比较元素 for(j = i - 1; j >= 0 && key > *A[j][k]; j--) { *A[j + 1][k] = *A[j][k]; } *A[j + 1][k] = key; } }
验证说明
修改后,当j递减到-1时,j >= 0为假,短路求值会直接终止循环,不会执行key > *A[j][k]的非法访问,既解决了段错误问题,又能让首个元素正常参与排序。
另外,你的allocMatrix内存分配逻辑是正确的,不存在内存分配错误导致的问题。
内容的提问来源于stack exchange,提问作者Interity
相关产品推荐
相关产品推荐

