1

考虑以下结构和函数来创建结构:

#define MAX_ELEMS 1000

struct stuff {
  double magic;
  bool is_valid[MAX_ELEMS];
  double values[MAX_ELEMS];
};

struct stuff make_stuff(double magic) {
    return (struct stuff){
        .magic = magic
    };
}

在我的情况下,我需要stuff.magic初始化为给定的值,并将stuff.is_valid数组初始化为零,但我不想初始化stuff.values(因为它们被保护stuff.is_valid并稍后按需初始化)。

我可以使用指定的初始化器来实现这一点吗?

我知道我可以在没有的情况下实现它,但这更丑陋且更容易出错(除其他原因外,因为我现在需要显式归零stuff.is_valid,也许使用 memset)。

4

2 回答 2

4

任何未特别初始化的字段都将用零填充。

所以,不,如果你初始化任何字段,它们都会得到一些东西(即使它只是零)

于 2020-07-27T19:54:14.320 回答
1

它只能通过“正常”的分配和 memset 来完成。

struct stuff make_stuff(double magic) 
{  
    struct stuff s;
    memset(s.is_valid, 0, sizeof(s.is_valid));
    s.magic = magic;
    return s;
} 

但是,如果您正在寻找返回如此大的结构的效率,那是没有意义的,因为它会完全复制两次,因为结构是按值传递的

最好将指针传递给结构。

struct stuff *make_stuff(struct stuff *s, double magic) 
{  
    memset(s -> is_valid, 0, sizeof(s -> is_valid));
    s -> magic = magic;
    return s;
} 
于 2020-07-27T21:14:50.097 回答