初始化多维数组

问题描述 投票:0回答:4

我有这个矩阵,其中包含一个4x4的double数组:

typedef struct {
    double data[4][4];
} mat;

在这里,我宣布我的mat

mat m1;

我想用零初始化我的mat

double data[4][4] = { { 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } };
MAT_A.data = data;

并得到这个错误:

表达式必须是可修改的左值

和:

'=':左操作数必须是l值

我也试过这个:

MAT_A->data = data;

编辑:

另一个问题是如何启动mat

c arrays
4个回答
1
投票

问题不在于数组data的初始化,而是在以下赋值中:

MAT_A.data = data;

要复制数组,您需要单独复制数组的元素:

for (int i = 0; i < 4; i++)
   for (int j = 0; j < 4; j++)
      MAT_A.data[i][j] = data[i][j];

1
投票

我想用零启动我的垫子:

然后你可以简单地编码:

mat m1 = {0};

要么

double data[4][4] = {0};

(而{}而不是{0}也会实际工作,即使是非标准的)

你甚至可以使用memset来清除区域(使用<string.h>标准标题):

double data[4][4];
memset (&data, 0, sizeof(data));

要么

memset (&m1, 0, sizeof(m1));

顺便说一下,如果GCCgcc -O2 -march=nativem1(在你的data上),优化编译器如automatic variable(调用call stack)可能会在所有情况下在实践中生成相同的机器代码。

但是,数组的赋值(m1.data = data;)是非法的(因为数组会衰减为指针)。

你的标题是错误的:C没有多维数组,只有(单维)数组(可能是数组数组,结构数组等)。


1
投票

问题是您不能将数组分配给结构,也不能将数组分配给数组。 C语法不允许它。

如果要初始化变量,则不应使用赋值。这些是不同的东西; MAT_A.data = data;是任务。这是初始化:

mat m =
{
  .data = { { 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }
};

至于赋值,你可以做的是为结构赋一个结构,例如使用复合文字:

m = (mat) 
{
  .data = { { 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }
};

0
投票

您可以按如下方式显式初始化数组。

for (int i = 0; i < 4; i++)
{
    for (int j = 0; j < 4; j++)
    {
        MAT_A.data[i][j] = 0;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.