在C中初始化多维数组

时间:2014-08-14 07:45:04

标签: c arrays multidimensional-array

我对在C ...中初始化多维数组感到困惑。

这有效:

 int foo[2][MAX] = {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
 };

但这不是:

int foo[2][MAX];
foo = {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
};

怎么回事?

6 个答案:

答案 0 :(得分:5)

此语法用于初始化,但在第二种情况下,您将其用于分配,这将无效。

type varName = someValue; // this is declaration and initialization

type varName; // this is declaration
varName = someValue; // this is assignment and not initialization

即初始化只能在申报时进行,否则它是正常的分配。

答案 1 :(得分:2)

{语法仅在您同时初始化和声明数组时有效。 声明后,您需要使用完整的语法:

foo[0][0] = 2;

从技术上讲,C只有一维数组。您可以通过生成数组来创建多维数组。数组的名称将转换为指向其第一个元素的指针,并且只将外部数组转换为指针。它是指向MAX int数组的指针,或int(*)[MAX]。

答案 2 :(得分:1)

正如您所说,此语法用于初始化数组,但在您的第二段代码中:

int foo[2][MAX];

此处,foo未初始化,然后

foo = {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
};

这是分配,而不是初始化

答案 3 :(得分:0)

你误解了'初始化'和'赋值'的概念。

例如

int a = 10; // Initialization

初始化只不过是声明+赋值。

但是

int a; // Declaration
a = 10; // Assignment

当你这样做时 -

int foo[2][MAX] = {
   {2,4,34,43,23,0},
   {2,4,34,43,23,0}
};

在内部了解了2行和MAX列。它将初始化整个数组。

可是 -

int foo[2][MAX];
foo = {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
};

此处foo表示数组的起始地址。在这里,您尝试将值分配给2D数组。当您尝试将值分配给数组时,它不知道有多少行和多少列。所以这是不可能的,也是不允许的。

如果要将输入分配给阵列A,更好的解决方案是从用户/运行时扫描 -

int foo[2][MAX],i,j;
for(i=0;i<2;i++){
   for(j=0;j<max;j++)
       scanf("%d",&foo[i][j]);
}

答案 4 :(得分:0)

多维与否,C中的数组不可复制,这意味着在初始化完成后,使用核心语言功能无法为整个数组分配任何内容。

但是,仍然可以使用memcpy函数复制数组。结合复合文字,它可以让你做你想做的事情。您只需使用不同的语法

int foo[2][MAX];

memcpy(
  foo, 
  (int[2][MAX]) {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
  },
  sizeof foo);

答案 5 :(得分:0)

在C99(或作为扩展程序的gcc)中,您可以使用compound literals

int (*foo)[MAX];

foo = (int [][MAX]) {
    {2,4,34,43,23,0},
    {2,4,34,43,23,0}
};

但请注意foo必须声明为指向MAX int的指针(不是2D数组)