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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:14:52