在C函数中传递二维数组

在C函数中传递二维数组,c,arrays,C,Arrays,我试图从函数返回一个二维数组,但出现了一些问题arr2出现错误 CXX0030:错误:无法计算表达式 代码 int**file2array(char*filename){ FILE*fp=NULL; 字符c; int i=0; int arr[9][9]; if((fp=fopen(文件名,“r”))==NULL) { printf(“无法打开文件\n”); } 其他的 { 而(!feof(fp)) { c=fgetc(fp); 如果(c=='。){ arr[i/9][i%9]=0; i++;

我试图从函数返回一个二维数组,但出现了一些问题<主函数上的代码>arr2出现错误

CXX0030:错误:无法计算表达式

代码
int**file2array(char*filename){
FILE*fp=NULL;
字符c;
int i=0;
int arr[9][9];
if((fp=fopen(文件名,“r”))==NULL)
{
printf(“无法打开文件\n”);
}
其他的
{
而(!feof(fp))
{
c=fgetc(fp);
如果(c=='。){
arr[i/9][i%9]=0;
i++;
}

如果(c>='1'&&c二维数组
int-arr[9][9]
和指向指针
int**arr
的指针不可互换,请使用指向数组
int(*arr2)[9]

void *file2array(char* filename){
    ...
    int arr[9][9];
    ...
    return arr;
}

int (*arr2)[9] = file2array("SolverInput.txt");
但是请注意,
arr
是一个局部变量(他的生命周期结束于函数),请使用
malloc

void *file2array(char* filename){
    ...
    int (*arr)[9] = malloc(sizeof *arr * 9);
    ...
    return arr;
}

int (*arr2)[9] = file2array("SolverInput.txt");
...
free(arr2);
如果您不知道前面的元素数(一个任意数而不是9),您可以使用可变长度数组(VLA)

另外,
fgetc()
返回一个
int
(不是
char

改变

char c;


当数组作为函数参数传递时,它的行为很奇怪。这就是C语言中的情况。只是不要这样做

相反,您应该将数组嵌入到
结构中

typedef struct {
    int cell[9][9];
} sudoku;
然后,您可以将一个
sudoku*
而不是
int**
传递给函数。这样做的直接好处是告诉代码的读者它的功能。一个
int**
几乎可以表示任何东西,但一个
sudoku*
不能

int read_sudoku(const char *filename, sudoku *sud) {

    if (some error happens)
        return -1;

    sud->cell[3][8] = 5;
    return 0;
}

int main() {
    sudoku sud;

    if (read_sudoku("sudoku001.txt", &sud) == -1) {
        fprintf(stderr, "cannot read sudoku\n");
        return EXIT_FAILURE;
    }

    ...
}

这是它能得到的最简单的代码。没有
malloc
,没有
free
,只是一些实际工作的代码。

首先,非常感谢第二,我应该只释放arr2还是释放每个索引?只有
arr2
,内容在同一块中,规则是:如果你调用
malloc
n次,你必须调用
免费
n次。不客气;)
int c;
typedef struct {
    int cell[9][9];
} sudoku;
int read_sudoku(const char *filename, sudoku *sud) {

    if (some error happens)
        return -1;

    sud->cell[3][8] = 5;
    return 0;
}

int main() {
    sudoku sud;

    if (read_sudoku("sudoku001.txt", &sud) == -1) {
        fprintf(stderr, "cannot read sudoku\n");
        return EXIT_FAILURE;
    }

    ...
}