You need to enable JavaScript to run this app. C语言开发数独程序时如何在其他函数中访问main内定义的数组
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发数独程序时如何在其他函数中访问main内定义的数组

问题原因

你遇到的grid未声明错误本质是C语言局部变量的作用域限制:在main()函数内部定义的grid数组是函数局部变量,仅在main函数的代码块内有效,其他函数无法直接访问。

error: ‘grid’ undeclared (first use in this function) 121 |
printf("%d ", &grid[i][i]);

解决方法
  • 方法1(推荐):将grid作为参数传递给被调用函数
    C语言中固定长度的二维数组可以直接按数组指针形式传递,不需要全局暴露变量,避免命名污染和意外修改。
  • 方法2:将grid定义为全局变量
    把grid数组的定义移到所有函数外部,整个文件内的所有函数都可以直接访问,但该写法可维护性差,不推荐使用。
代码中其他需要修正的语法错误
  • 函数参数类型错误:find_empty_box、Answer_Valid等函数的sudoku参数当前定义为int类型,实际需要传入二维数组,应该写为int sudoku[9][9]或者int (*sudoku)[9]
  • 滥用取地址符&:&grid[i][i]是取该位置元素的内存地址,你需要输出元素值直接写grid[i][j]即可;另外sudoku[&x][&y]这类写法完全错误,数组下标必须是整数值,不能是变量地址
  • 循环变量重名:内外层循环都用了i作为变量名,会导致内层循环覆盖外层的i值,内层循环应该换用j作为变量名
  • 多返回值写法错误:C语言不支持直接返回多个值,return x,y是逗号表达式,实际只会返回最后一个值y,如果需要返回多个坐标,可以用指针参数或者结构体传递
  • 条件判断逻辑错误:i < 1||2||3||4||5||6||7||8||9的写法不符合C语法,遍历1-9直接写for(int i=1;i<=9;i++)即可
修正后的完整可运行代码示例
#include <stdio.h>
#include <stdbool.h>

// 提前声明函数原型
bool find_empty_box(int sudoku[9][9], int *x, int *y);
bool Answer_Valid(int sudoku[9][9], int guess, int row, int col);
bool Solver(int sudoku[9][9]);
void print_sudoku(int sudoku[9][9]);

int main()
{
    int grid[9][9] = 
    {
        {8,0,0,0,0,0,0,0,0},
        {0,0,3,6,0,0,0,0,0},
        {0,7,0,0,9,0,2,0,0},
        {0,5,0,0,0,7,0,0,0},
        {0,0,0,0,4,5,7,0,0},
        {0,0,0,1,0,0,0,3,0},
        {0,0,1,0,0,0,0,6,8},
        {0,0,8,5,0,0,0,1,0},
        {0,9,0,0,0,0,4,0,0}
    };

    printf("原数独:\n");
    print_sudoku(grid);

    if(Solver(grid)){
        printf("\n求解结果:\n");
        print_sudoku(grid);
    }else{
        printf("\n该数独无解\n");
    }
    return 0;
}

void print_sudoku(int sudoku[9][9]){
    for (int i = 0; i < 9; ++i)
    {
        for (int j = 0; j < 9; ++j)
        {
            printf("%d ", sudoku[i][j]);
        }
        printf("\n");   
    }
}

bool find_empty_box(int sudoku[9][9], int *x, int *y)
{
    for (int i = 0; i < 9; ++i)
    {
        for (int j = 0; j < 9; ++j)
        {
            if (sudoku[i][j] == 0)
            {
                *x = i;
                *y = j;
                return true;
            }
        }
    }
    return false;
}

bool Answer_Valid(int sudoku[9][9], int guess, int row, int col)
{
    // 检查行
    for (int i = 0; i <9; ++i)
    {
        if (sudoku[row][i] == guess && i != col)
        {
            return false;
        }
    }
    // 检查列
    for (int i = 0; i <9; ++i)
    {
        if (sudoku[i][col] == guess && i != row)
        {
            return false;
        }
    }
    // 检查3*3宫格
    int row_start = (row / 3) * 3;
    int col_start = (col / 3) * 3;
    for (int x = row_start; x < row_start+3; ++x)
    {
        for (int y = col_start; y < col_start+3; ++y)
        {
            if (sudoku[x][y] == guess && x != row && y != col)
            {
                return false;
            }
        }
    }
    return true;
}

bool Solver(int sudoku[9][9])
{
    int row, col;
    if(!find_empty_box(sudoku, &row, &col)){
        // 没有空位,求解完成
        return true;
    }
    for (int guess = 1; guess <=9; ++guess)
    {
        if(Answer_Valid(sudoku, guess, row, col))
        {
            sudoku[row][col] = guess;
            if(Solver(sudoku))
            {
                return true;
            }
            // 回溯
            sudoku[row][col] = 0;
        }
    }
    return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:09:00