用单个字段初始化结构体



我有一个结构体:

 struct MY_TYPE {
      boolean flag;
      short int value;
      double stuff;
    };

我知道我可以初始化它:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

但是,现在我需要创建一个指针变量My_TYPE*,我只想在那里初始化一个字段?例如:

MY_TYPE *a = {.value = 123};

但是我得到编译错误"Designator in intializer for scalar type 'struct MY_TYPE *'"

是否可以用一个字段初始化结构体?

首先,您混淆了struct MY_TYPE和typedef。由于这个原因,发布的代码将不起作用。你必须这样做:

typedef struct 
{
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;
然后,您可以使用指向复合字面值的指针来实现您要查找的内容:
MY_TYPE* ptr = &(MY_TYPE){ .flag = true, .value = 123, .stuff = 0.456 };

但是请注意复合文字将具有局部作用域。如果您希望在局部作用域结束后使用这些数据,那么您必须使用指向静态或动态分配变量的指针。

可以使用复合文字

#include <stdio.h>
#include <stdbool.h>   
struct MY_TYPE
{
    bool flag;
    short int value;
    double stuff;
};
int main(void)
{
    struct MY_TYPE *a = &(struct MY_TYPE){.value = 123};
    printf("%dn", a->value);
}

这是可能的,如果你先创建一个你想要初始化的结构的实际实例,然后让指针指向它。

struct MY_TYPE a = {.value = 123};
struct MY_TYPE *p = &a;

如果你想动态分配一个结构,那么不,这是不可能的。然后你需要分两步来做:分配;然后是初始化:

struct MY_TYPE *p = calloc(1, sizeof *p);
p->value = 123;

你得到的错误与初始化无关,而是你试图用一个不是指针的东西初始化一个指针。

最新更新