我收到这个错误:
incompatible pointer types returning 'int [4][2]' from a function with result type 'int *'
当我尝试这样做时
int* getValid(int blank[2]){
int row = blank[0];
int col = blank[1];
static int valid[4][2];
valid[0][0] = row;
valid[0][1] = col-1;
valid[1][0] = row;
valid[1][1] = col+1;
valid[2][0] = row-1;
valid[2][1] = col;
valid[3][0] = row+1;
valid[3][1] = col;
return valid;
}
我正在尝试返回我在函数内部生成的二维数组。
我主要是用 Python 编写代码,所以 C 中的数组让我大吃一惊..
最佳答案
您不能将数组传递给 C 中的函数或从中传递给函数。但是您可以传递指针。这可以指向一个数组。
所以,你需要一个像这样的函数:
#define COLS 2
int (*getValid(int blank[2]))[COLS]
{
static int valid[4][COLS];
...
return valid;
}
注意括号。我还使用 COLS
作为内部维度的长度。这避免了魔数(Magic Number),即在整个代码中重复常量。将该宏用于数组涉及的所有声明,包括定义。
这是一个“没有参数的函数,返回一个指向具有 COLS
int
s 的一维数组的指针”。有关 C 中数组和指针的详细信息,请参阅一本好的 C 书籍并自行研究。请记住,虽然它们是不同的类型,但它们在实际使用中有很多共同点(背后的语言机制更难理解)。
简单地说,如果您在上述函数声明中使用return valid
,数组的名称将转换为指向第一个元素的指针。这正是您应返回的内容。
调用者需要为结果使用相同的指针类型(指向一维数组的指针):
int (*arr)[COLS] = getValid(...);
像访问原始数组一样访问元素:
arr[row][col]
附加信息:你不应该在函数中使用静态数组,除非你想在调用之间保持安全状态。更好地使用 malloc
动态分配数组:
int (*arr)[COLS];
arr = malloc(sizeof(*arr) * 4); // 4 rows of the inner array
不要忘记检查 malloc
是否失败并采取适当的措施。
另外不要忘记在使用完后释放动态分配的数组(但不要更早):
free(arr);
关于我可以在 C 中返回一个二维数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37913760/