9x9数独暴力生成程序出现segmentation fault,求助定位问题
解决暴力法生成数独时的Segmentation Fault问题
1. inputRandoms函数的逻辑错误
你的洗牌函数存在两处关键问题,虽不直接触发段错误,但会破坏逻辑并间接引发异常:
- 无效的循环判断:
while (j < 0 && j >= 10)条件永远为假(rand() % (i+1)生成的范围是0到i,最大为8,不可能超出数组下标0-8的范围),导致该循环完全不执行。更严重的是j仅在函数开头初始化一次,后续循环重复使用上一次的j值,完全不符合Fisher-Yates洗牌的核心逻辑。 - 修复后的洗牌函数:
void inputRandoms(int arr[]) { int temp, j; for (int i = 8; i > 0; i--) { j = rand() % (i + 1); // 每次循环重新生成0到i的随机下标 temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
2. 触发段错误的核心原因:数组越界访问
在newValueInput函数中,你定义了int temp[9](合法下标范围0-8),但执行了temp[count + 1] = value[j];:
- 当
count递增到8时,count+1=9,超出了temp数组的下标上限,会直接破坏栈内存中的其他数据,触发segmentation fault。 - 修复方式:若需存储当前列的已有值+新值,将temp数组定义为
int temp[10];或调整逻辑,直接对比value[j]与matrix中该列的已有元素,无需额外存储。
3. 列唯一性检查逻辑完全错误
当前的重复判断if (temp[k] == temp[8 - k])无法正确检测列内重复值,正确逻辑应遍历当前列已有的所有行,检查新值是否已存在:
// 替换newValueInput中的检查逻辑 void newValueInput(int value[]) { inputRandoms(value); int isDuplicate = 0; // 检查每一列是否有重复 for (int j = 0; j < 9; j++) { for (int i = 0; i < count; i++) { if (matrix[i][j] == value[j]) { isDuplicate = 1; break; } } if (isDuplicate) break; } if (!isDuplicate) { inputRow(matrix, value, &count); } else { newValueInput(value); } }
4. 递归调用的栈溢出风险
newValueInput中递归调用自身的逻辑存在无限递归可能:若连续生成不符合条件的随机数组,会不断递归导致栈溢出,同样触发segmentation fault。建议用循环替代递归,或增加递归深度限制。
内容的提问来源于stack exchange,提问作者TheUnknown
相关产品推荐
相关产品推荐

