我对C语言还是个新手,我搞不懂为什么下面的代码不能工作:
typedef struct{
uint8_t a;
uint8_t* b;
} test_struct;
test_struct test = {
.a = 50,
.b = {62, 33}
};
如果我这样做,它会起作用:
int temp[] = {62, 33};
test_struct test = {
.a = 50,
.b = temp
};
我对C语言还是个新手,我搞不懂为什么下面的代码不能工作:
typedef struct{
uint8_t a;
uint8_t* b;
} test_struct;
test_struct test = {
.a = 50,
.b = {62, 33}
};
如果我这样做,它会起作用:
int temp[] = {62, 33};
test_struct test = {
.a = 50,
.b = temp
};
b
成员不是数组,而是指针.因此,当您try 像这样进行初始化时:
test_struct test = {
.a = 50,
.b = {62, 33}
};
您将test.b
设置为转换为指针的值62,并丢弃额外的初始值设定项.
第二种情况之所以有效,是因为您使用temp
来初始化b
成员,这是一个int
数组,它衰减为指向int
的指针,以匹配成员b
的类型.
你也可以做这样的事情,它会奏效:
test_struct test = {
.a = 50,
.b = (int []){62, 33}
};
但是,指向复合文字的指针仅在声明它的作用域中有效.因此,如果您在函数中定义了此 struct 并返回其副本,则指针将不再有效.