我想知道在C中是否可以用以下方式初始化结构:
struct Test* test = { .int_value = 10, .char_value = 'c', .pointer_to_float_value = (float*)1.512 };
如果我试图用一种定义的结构来实现这一点:
struct Test
{
int int_value;
char char_value;
float* pointer_to_float_value;
};
我得到一个错误的所有元素的结构:
error: field name not in record or union initializer
有没有办法绕过这个问题?
此语法
struct Test* test { .int_value = 10, .char_value = 'c', .pointer_to_float_value = (float*)1.512 };
无效。
相反,您可以使用复合文字,例如
float f = 1.512f;
struct Test* test = &( struct Test ){ .int_value = 10, .char_value = 'c', .pointer_to_float_value = &f };
来自C标准(6.5.2.5复合文字(
5复合文字的值是未命名对象的值由初始值设定项列表初始化。如果出现复合文字在函数体之外,对象具有静态存储期间否则,它具有与关联的自动存储持续时间封闭块。
这确实是可能的,但您正在声明一个指向结构的指针,并试图将其初始化为结构(而不是指针(。浮点指针也有同样的问题。以下内容应该有效:
float a = 1.512;
struct Test test_struct = { .int_value = 10, .char_value = 'c', .pointer_to_float_value = &a };
struct Test *test = &test_struct;
您的代码存在许多问题。您没有=
符号,并且没有正确处理指针和类型。
可以这样做:
struct Test * test = &(struct Test){ .int_value = 10,
.char_value = 'c',
.pointer_to_float_value = &(float){1.512f} };
注意它是如何使用(struct Test)
来设置复合文字的类型,并使用&
来获取指向它的指针的。这同样适用于浮点指针。