我有一个结构体:
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;
你得到的错误与初始化无关,而是你试图用一个不是指针的东西初始化一个指针。