我有这个矩阵,其中包含一个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
?
问题不在于数组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];
我想用零启动我的垫子:
然后你可以简单地编码:
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));
顺便说一下,如果GCC或gcc -O2 -march=native
是m1
(在你的data
上),优化编译器如automatic variable(调用call stack)可能会在所有情况下在实践中生成相同的机器代码。
但是,数组的赋值(m1.data = data;
)是非法的(因为数组会衰减为指针)。
你的标题是错误的:C没有多维数组,只有(单维)数组(可能是数组数组,结构数组等)。
问题是您不能将数组分配给结构,也不能将数组分配给数组。 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 } }
};
您可以按如下方式显式初始化数组。
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
MAT_A.data[i][j] = 0;
}
}