将2D数组分配给结构中的2D数组
我有一个函数试图循环结构中的2D数组:
typedef struct node { int grid[3][3]; } Node; void someFunction(Node *node) { int grid[3][3] = node->grid; //loop through }
当我尝试编译时,我得到了一个
mp.c:42:错误:初始化程序无效
您不能在C中分配数组。这是不允许的。 你写的时候:
int grid[3][3] = node->grid;
您试图从传入的node
初始化本地数组grid
。 如果允许(事实并非如此),那么之后你就不需要循环了。
但是,您可以分配结构,即使它们包含数组,因此如果本地结构是Node
,您可以编写:
Node local = *node;
之后您不需要循环遍历数组以初始化local
。
您可以循环遍历数组,一次复制一个元素:
for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) grid[i][j] = node->grid[i][j];
您还可以使用memmove()
或memcpy()
:
int grid[3][3]; assert(sizeof(grid) == sizeof(node->grid)); memcpy(grid, node->grid, sizeof(grid));
有一次,另一个答案表明:
换行:
int grid[3][3] = node->grid;
至:
int **grid = node->grid;
我注意到这不起作用 – 并且合理地挑战解释原因。 这需要空间和格式。
首先,编译器注意到:
warning: initialization from incompatible pointer type
那就是说’你正在玩火’。
我们假设我们忽略了这个警告。 现在,本地grid
指向数组的左上角(如果您看到数组逐渐增长,从左到右)。 存储在那里的值是一个普通数字,而不是一个初始化的指针,但是当编译器评估grid[0]
,它被强制假设会产生一个指针。 如果node->grid[0][0]
包含零,您可能会得到一个分段错误和核心转储以取消引用空指针(假设指针和int
的大小相同,通常在32-位系统),或其他一些未定义的行为。 如果node->grid[0][0]
包含另一个值,则行为仍未定义,但不完全可预测。
如果你不想复制,只需要一个指向结构中数组的指针(注意:如果你给*pointer
赋值,结构中数组的内容会被改变),你可以实现这个目标有两种方式:
#include typedef struct node { int grid[3][3]; } Node; void someFunction1(Node *node) { int i, j; int (*grid)[3] = node->grid; for(i=0; i<3; i++){ for(j=0; j<3; j++){ printf("%d ", grid[i][j]); } printf("\n"); } } void someFunction2(Node *node) { int i, j; int *grid = (int*) node->grid; for(i=0; i<3; i++){ for(j=0; j<3; j++){ printf("%d ", grid[i*3+j]); // i * column_number + j } printf("\n"); } } int main() { Node t; int i, *p; //initialization: t.grid[0][0]=0, ..., t.grid[2][2]=8 for(i=0, p=(int*)t.grid; i<9; p++, i++){ *p = i; } printf("Function1:\n"); someFunction1(&t); printf("Function2:\n"); someFunction2(&t); return 0; }
上面的代码显示了一个使用指针的简单函数。 它们都安全且符合标准。
如果你想使用指针指向int**
,你将不得不以不同的方式使用它,因为,数组是内存中的线性存储(因此上面的代码可以使用int*
指向数组的开头)并操作它,但int**
不。
编辑
所以这里有someFunction3()
void someFunction3(Node *node) { int i, j; int **p; // 3 is the row number. Ignore checking malloc failure p = malloc(sizeof(int)*3); for(i=0; i<3; i++) { p[i] = (int*) node->grid[i]; //assign address of each row of array to *p } for(i=0; i<3; i++) { for(j=0; j<3; j++) { printf("%d ", p[i][j]); } printf("\n"); } free(p); }
请参阅此其他线程以获取相同的问题以及不涉及复制内存的答案:
创建指向二维数组的指针