C 初始化结构内部的二维数组

C 初始化结构内部的二维数组,c,C,我正在尝试初始化结构中的int的二维数组。 在我的程序“全局访问”开始时,我创建了一个结构,以及该结构的一个数组: struct block { int theblock[3][3]; }; struct block blockArray[6]; 然后,我尝试初始化函数中的结构数组: void afunction() { int block1[3][3] = { {0, 1, 0}, {0, 1, 0}, {0, 1, 0}

我正在尝试初始化结构中的int的二维数组。 在我的程序“全局访问”开始时,我创建了一个结构,以及该结构的一个数组:

struct block {
   int theblock[3][3];
};

struct block blockArray[6];
然后,我尝试初始化函数中的结构数组:

void afunction() {
    int block1[3][3] = {
        {0, 1, 0},
        {0, 1, 0},
        {0, 1, 0}
    };

    blockArray[0].theblock = block1;   
}
编译器错误:

error: incompatible types when assigning to type 'int[3][3]' from type 'int[*][3]'

谁能解释一下我做错了什么,我知道这是很基本的东西,但我真的试着自己去阅读并解决这个问题。我来自Java,试图学习C。

创建一个临时结构,并将其分配给结构数组中的元素:

struct block temp = { { {0, 1, 0}, {0, 1, 0}, {0, 1, 0} } } ;

blockArray[0] = temp ; 
或者只需使用阵列并复制它:

int temp[3][3] = { {0, 1, 0}, {0, 1, 0}, {0, 1, 0} } ;

assert( sizeof( temp ) == sizeof( blockArray[0].theblock ) ) ;
memcpy( blockArray[0].theblock , temp , sizeof( temp ) ) ; 

在C语言中不能以这种方式复制数组。因此,我认为在Java中也不能这样做

例如,您可以复制周围的指针

blockArray[0].theblock = block1;
但所有这些都将使blockArray[0]与&block1[0]位于同一地址。它不复制任何内容,它是一个肤浅的副本

您必须使用memcpy或在循环中复制成员:

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        blockarray[0].theblock[i][j] = block1[i][j];

在C语言中,您不能分配给数组。要么在创建数组时对其进行初始化,要么逐个元素填充数组。这是一份深度复制品。如果结构的成员是动态分配的,那么这些成员只是别名,而不是深度复制的结果。memcpy还可能阻止在这种特殊情况下进行某些优化。@Dogbert你在混淆视听。我建议您再次阅读您的链接。谢谢,这听起来是最简单的解决方案。我试试看。