Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中结构初始化的数组_C - Fatal编程技术网

C中结构初始化的数组

C中结构初始化的数组,c,C,我找不到解决这个问题的办法。我可以像这样初始化结构数组: struct wrapper{ int arr[3]; } x; x = (struct wrapper){{1,2,3}}; typedef结构S_A{ int x; }图阿; T_A ta1[3]; ta1[0]=(T_A){0}; ta1[1]=(T_A){1}; ta1[2]=(T_A){2}; T_A ta2[3]={{0},{1},{2}; 但是,在声明之后如何进行单行初始化呢 T_A ta3[3]; ta3=(

我找不到解决这个问题的办法。我可以像这样初始化结构数组:

struct wrapper{
    int arr[3];
} x;

x = (struct wrapper){{1,2,3}};
typedef结构S_A{
int x;
}图阿;
T_A ta1[3];
ta1[0]=(T_A){0};
ta1[1]=(T_A){1};
ta1[2]=(T_A){2};
T_A ta2[3]={{0},{1},{2};
但是,在声明之后如何进行单行初始化呢

T_A ta3[3];
ta3=(?){{{?},{?},{?};
ta3=(T_A[3]){{0},{1},{2};//错误
ta3=(T_A*){{0},{1},{2};//错误

数组在C中是特殊的。只能初始化一次数组。然后不能“重新初始化”数组。数组上的赋值不起作用。在大多数上下文中,数组是一个无法指定的指针。你不能:

int arr[3];
// arr = {1,2,3}; // will not work
// arr = anything; // will not work
您只能使用复合文字对其执行
memcpy

memcpy(ta3, (T_A[3]){ { 0 }, { 1 }, { 2 } }, sizeof(ta3));
或者不使用compund literal初始化临时变量并
memcpy

const T_A temp[3] = { { 0 }, { 1 }, { 2 } };
memcpy(ta3, temp, sizeof(ta3));

数组在C中是特殊的。只能初始化一次数组。然后不能“重新初始化”数组。数组上的赋值不起作用。在大多数上下文中,数组是一个无法指定的指针。你不能:

int arr[3];
// arr = {1,2,3}; // will not work
// arr = anything; // will not work
您只能使用复合文字对其执行
memcpy

memcpy(ta3, (T_A[3]){ { 0 }, { 1 }, { 2 } }, sizeof(ta3));
或者不使用compund literal初始化临时变量并
memcpy

const T_A temp[3] = { { 0 }, { 1 }, { 2 } };
memcpy(ta3, temp, sizeof(ta3));
在C语言中,初始化是在声明的同时进行的。你不能事后再做

这可以在您可以在此处找到的语法中看到:

当您在完成声明后使用
=
时,它是一个赋值而不是初始化,赋值有不同的规则。其中一条规则是,不允许使用初始化数组的常用方法--
={1,2,3}
。你必须使用
memcpy
或类似的东西

当涉及到非数组时,如
int
double
等及其指针,仍然不能在声明后正式初始化它们,但对于那些数组,赋值具有相同的语法,因此可能会造成混淆

但是,有一个技巧可以用于数组。将数组包装在结构中,并执行以下操作:

struct wrapper{
    int arr[3];
} x;

x = (struct wrapper){{1,2,3}};
在C语言中,初始化是在声明的同时进行的。你不能事后再做

这可以在您可以在此处找到的语法中看到:

当您在完成声明后使用
=
时,它是一个赋值而不是初始化,赋值有不同的规则。其中一条规则是,不允许使用初始化数组的常用方法--
={1,2,3}
。你必须使用
memcpy
或类似的东西

当涉及到非数组时,如
int
double
等及其指针,仍然不能在声明后正式初始化它们,但对于那些数组,赋值具有相同的语法,因此可能会造成混淆

但是,有一个技巧可以用于数组。将数组包装在结构中,并执行以下操作:

struct wrapper{
    int arr[3];
} x;

x = (struct wrapper){{1,2,3}};

不幸的是,正如其他人已经提到的,不能为数组分配任何内容

int arr[N];
...
arr = ... ; // --> This will always fail compilation
在这种情况下,唯一的选择是分别为每个数组项分配新值

arr[i] = ...;
或者使用
memcpy
从其他内存位置复制值

有趣的是,如果定义一个数组结构而不是一个数组结构:

那么声明后的赋值是允许的:

typedef struct S_S {
     int x[3];
} T_S;

int main(void)
{
   T_S y;

   y = (T_S){.x = {1, 2, 3}}; //OK!

  return 0;
}

这(假设您的编译器支持C99标准)

不幸的是,正如其他人已经提到的那样,不能为数组分配任何内容

int arr[N];
...
arr = ... ; // --> This will always fail compilation
在这种情况下,唯一的选择是分别为每个数组项分配新值

arr[i] = ...;
或者使用
memcpy
从其他内存位置复制值

有趣的是,如果定义一个数组结构而不是一个数组结构:

那么声明后的赋值是允许的:

typedef struct S_S {
     int x[3];
} T_S;

int main(void)
{
   T_S y;

   y = (T_S){.x = {1, 2, 3}}; //OK!

  return 0;
}

这(假设您的编译器支持C99标准)

好的,第二次我有这个问题,为什么我的“你好/你好”在我的帖子开始时消失了?这正常吗?我做错什么了吗?关于问候语:声明后不能初始化。在这一点上,你将处理任务。您无法分配数组。好的,第二次遇到这个问题时,为什么我的“hello/hi”会在帖子开始时消失?这正常吗?我做错什么了吗?关于问候语:声明后不能初始化。在这一点上,你将处理任务。您不能分配数组。谢谢,这非常清楚!因为我可以用结构来做,所以我认为也可以用结构数组来做,但是没有^^。非常感谢。@Stephane有一个老习惯,你可以在结构声明
typedef struct{int arr[5]}structarray中包装一个数组以便您可以将一个
structarray
分配给另一个。不过,这会让其他事情变得有点笨重,所以在你投入工作之前先考虑一下权衡。谢谢,这是非常清楚的!因为我可以用结构来做,所以我认为也可以用结构数组来做,但是没有^^。非常感谢。@Stephane有一个老习惯,你可以在结构声明
typedef struct{int arr[5]}structarray中包装一个数组以便您可以将一个
structarray
分配给另一个。不过,这会让其他事情变得有点笨重,所以在你投入工作之前先考虑一下权衡。谢谢你的澄清!但不感谢链接XD,我不是在读它,我宁愿用蛮力的方式,直到它编译哈哈哈。不用说了,Yacc、bnf和其他类似的语法文档对我来说是不可读的。如果有一天我必须做一个编译器,我会做的,但在那之前…@Stephane没有必要完全学习它,但我建议至少快速浏览一下。我特别建议学习陈述和主要表达之间的区别。还有,联合国