在C函数中传递二维数组

时间:2016-11-12 09:02:47

标签: c arrays

我试图从函数返回一个二维数组,但出了点问题。主函数arr2收到错误,

  

CXX0030:错误:无法评估表达式

代码

int** file2array(char* filename) {

    FILE *fp = NULL;
    char c;
    int i = 0;
    int arr[9][9];

    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf("File could not be opened\n");
    }
    else
    {
        while (!feof(fp))
        {
            c = fgetc(fp);

            if (c == '.') {
                arr[i/9][i%9] = 0;
                i++;
            }

            if (c>= '1' && c<='9') {
                arr[i/9][i%9] = c - 48;
                i++;
            }
        }
        fclose (fp);
    }

    return arr;
}

int main(){
    int** arr2 = file2array("SolverInput.txt");
}

2 个答案:

答案 0 :(得分:1)

2D数组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)

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

int dim = 9;
int (*arr2)[dim] = file2array("SolverInput.txt", dim);
...
free(arr2);

此外,fgetc()会返回int(不是char

更改

char c;

int c;

答案 1 :(得分:0)

当数组作为函数参数传递时,数组表现得非常奇怪。这就是它在C中的表现。只是不要这样做。

相反,您应该将数组嵌入struct

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,只是执行实际工作的一些代码。