初始化结构数组成员的最有效方法?

Y K*_*Kal 10 c

我已经声明了结构

struct wnode {
  char *word;
  int lines[MAXLINES];
  struct wnode *left;
  struct wnode *right;
};
Run Code Online (Sandbox Code Playgroud)

和指针

struct wnode *p;
Run Code Online (Sandbox Code Playgroud)

指针被传递给一个函数。在该函数中,我首先使用 malloc 为指针分配内存。然后我想该struct成员初始化线零出结构体成员

数组初始化方法将不起作用,因为它被解释为赋值:

p->lines[MAXLINES] = {0};
Run Code Online (Sandbox Code Playgroud)

编译器抛出错误:

错误:'{' 标记前的预期表达式

最后,我只是使用 for 循环将lines数组清零:

for (i = 0; i < MAXLINES; i++)
  p->lines[i] = 0;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

dbu*_*ush 6

数组不能直接赋值。您需要使用循环将所有字段设置为 0,或者您可以使用memset

memset(p->lines, 0, sizeof(p->lines));
Run Code Online (Sandbox Code Playgroud)

请注意,对于非字符类型,您只能这样做以将所有成员设置为 0。对于任何其他值,您需要一个循环。


P__*_*J__ 5

如果你想使用=运算符,你可以这样做:

struct wnode wn, *p;
/* ........ */
wn = (struct wnode){.word = wn.word, .lines = {0,}, .left = wn.left, .right = wn.right};
*p = (struct wnode){.word = p ->word, .lines = {0,}, .left = p -> left, .right = p -> right};
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的方法,因为OP当然不想只初始化/分配“.lines”成员,而是所有成员。这个答案实现了编译器可以一步优化并实现“初始化”所有“结构”成员的最有效方法。 (2认同)