关于C#:如何一次初始化多个struct变量? | 珊瑚贝

How to initialize several struct variables at once?


对于像

这样的结构

1
2
3
4
5
struct data{
   int a;
   int b;
   int c;
};

如何一次用相同的值初始化该结构的多个实例?

代替:

1
struct data object1 = {0,0,0}, object2 = {0,0,0}, object3 = {0,0,0};
  • “相同的值”是什么意思?它是否意味着所有对象的 {1,2,3} 或始终只有 {0,0,0} ?
  • 将所有字段初始化为 int 0 是一回事。初始化为非零”相同值”是另一个。你的目标是哪一个?
  • 请参阅 C 数组的范围初始化
  • 任何特殊原因都被标记为 arrays?
  • 用任何值初始化。 0,0,0 仅用于示例。


首先,我更喜欢 Linux 内核风格,并且更喜欢指定的初始化器。

我会做他们所做的,并创建一个宏来初始化你的结构。这使得添加元素和控制它们的初始化方式变得容易。

1
2
3
4
5
6
7
8
9
10
11
struct data {
   int a;
   int b;
   int c;
};

#define INIT_DATA { \\
    .a = 0, \\
    .b = 0, \\
    .c = 0, \\
}

并像这样使用它:

1
struct data mydata = INIT_DATA;

继续使用 Linux 风格,无论如何,一行中的这些变量不会超过一个。当添加/删除变量时,它可以更容易地查看不同的内容。有什么问题:

1
2
struct data old_data = INIT_DATA;
struct data new_data = INIT_DATA;

如果你有多个,它们应该是单个变量还是应该是一个数组?如果是这样,您可以利用 GNU 扩展来初始化范围:

1
2
3
struct data datas[N] = {
    [0N1] = INIT_DATA,
};

否则,您将需要使用常规的旧循环在运行时初始化数据。

  • 终于到了关于使用 GNU 扩展初始化范围的部分。
  • 我不熟悉 GNU 扩展,但 [0 … N] 看起来不对。是否为 N 数组指定元素 0,1,2…N(N+1 元素)? (一个太多)
  • @JonathonReinhart 现在这好多了,提高了。另外,在我的文章中引用了您的答案。 :)
  • @chux 是的,你是对的;我已将其更改为 N-1。我已经习惯了 Python 的切片,下限是包容的,上限是独占的。


您可以获取 struct 的数组并使用单个大括号括起来的初始值设定项,例如

1
 struct data object [3] = {0};

go 有多个该结构类型的变量,全部初始化为 0(或等效)。

这利用了初始化的特殊属性,引用 C11, chapter

The initialization shall occur in initializer list order, each initializer provided for a
particular subobject overriding any previously listed initializer for the same subobject;151)
all subobjects that are not initialized explicitly shall be initialized implicitly the same as
objects that have static storage duration.

以及具有 static 存储的对象的初始化,

[…] If an object that has static or thread storage duration is not initialized
explicitly, then:

a€” if it has pointer type, it is initialized to a null pointer;

a€” if it has arithmetic type, it is initialized to (positive or unsigned) zero;


a€” if it is an aggregate, every member is initialized (recursively) according to these rules,
and any padding is initialized to zero bits;

a€” if it is a union, the first named member is initialized (recursively) according to these
rules, and any padding is initialized to zero bits;

也就是说,如果您不希望将所有值初始化为 0,还有其他方法。正如 Jonathon Reinhart 先生在另一个答案中提到的那样,您可以使用指定的初始化程序。

  • 很好很简短,但前提是所有数据都应设置为 0。对于”相同值”的更一般意义,这将不起作用。
  • 也许,也许不是。正文部分没有提到这个限制。我认为这个例子只是一个糟糕的例子。如果他想全部为 0,那么他可能会直接告诉我们,而不是使用通用的”相同值”短语。


how can I initialize several instances of that struct with identical values at once?

不是真的”一次”,不管这意味着什么,但至少不重复自己(即遵循 DRY 原则)你可以这样做:

1
2
3
4
5
6
int main(void)
{
  struct data object1 = {1, 2, 3}, object2 = object1, object3 = object1;

  …
}

或者每个定义单独一行:

1
2
3
4
5
6
7
8
int main(void)
{
  struct data object1 = {1, 2, 3};
  struct data object2 = object1;
  struct data object3 = object1;

  …
}

  • 谢谢你,在所有好的建议中,你的建议最吸引我。


创建一个结构数组并在循环中初始化它们。

1
2
3
4
5
6
7
8
struct data array[N_ITEMS];

for(i=0; i<N_ITEMS; i++)
{
    array[i].a=a;
    array[i].b=b;
    array[i].c=c;
}

如果要将所有字段初始化为0,可以使用memset:

1
 memset(array, 0, sizeof(array));
  • “如果你想将所有字段初始化为相同的值,你可以使用 memset。” 这是一个危险的建议,因为 memset 仅适用于字节,因此它只能用于将整个事物初始化为零。
  • @JonathonReinhart 你是对的。尽管在这种情况下,如果他想用一些奇异的值(例如 -1)进行初始化,他仍然可以使用 memset。
  • 虽然您在技术上是正确的,但这样的黑客永远不会通过代码审查,因为它是一个地雷。
  • 没有提到所有字段的值应该相同。所有字段中的字节也不相同。对于结构的所有实例,该值应该相同。 memset 绝对不是一个合适的选择。
  • @JonathonReinhart:并且仅当结构中任何指针的位表示对于 NULL 都是全0 时。并且仅当结构中任何浮点的位表示对于 0.0 都是全 0 时。还有<等等…>。
  • 同意,这通常很糟糕。也就是说,今天是否存在任何架构,其中这些值并非全为零?


来源:https://www.codenong.com/41395931/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_10173.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?