我可以在 C 中返回一个二维数组吗?

标签 c arrays 2d

我收到这个错误:

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 ints 的一维数组的指针”。有关 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/

相关文章:

c++ - 通过宏内联函数

c - 使用 C 的基本文件输入

c++ - 有比这更短的方式吗?(计算 C 中字符串中 char 的出现次数)

Javascript 创建一个 div,里面有 array[i] 中的 img 和 p

arrays - 为什么在使用 ReadBytesExt 从 byte slice 段中读取整数时会出现错误 "trait bounds were not satisfied"?

c - 如何在C中将图像旋转90度

c++ - gluProject() 的奇怪结果

Java - 使用 GUI 和 2D 图形

javascript - JQuery/javascript 将 div 放置在父 div 的任意位置

c - 如何检查 256i(16 位) vector 以了解它是否包含大于零的元素?