我有一个结构:
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 *'"
。
是否可以使用一个字段初始化结构?
答案 0 :(得分:15)
首先,您要混淆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 };
但请注意,复合文字将具有本地范围。如果您希望在本地范围的末尾使用这些数据,则必须使用指向静态或动态分配变量的指针。
答案 1 :(得分:5)
您可以使用compound literals。
#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("%d\n", a->value);
}
答案 2 :(得分:4)
如果你首先创建一个按照你想要的方式初始化的结构的实际实例,然后使指针指向它,那么这是可能的。
E.g。
struct MY_TYPE a = {.value = 123};
struct MY_TYPE *p = &a;
如果要动态分配结构,那么就不可能。然后你需要分两步完成:分配;接下来是初始化:
struct MY_TYPE *p = calloc(1, sizeof *p);
p->value = 123;
您得到的错误与初始化无关,但您尝试使用非指针的东西初始化指针。