使用指针初始化C结构体。

3

我对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
};

2
你期望第二段代码将b的值设置为什么?指向什么?在第二段代码中,很明显它指向了temp。那么第一段代码应该让b指向什么? - David Schwartz
1个回答

5
成员变量 b 不是数组而是指针。 因此,当您尝试像这样初始化时:
test_struct test = {
    .a = 50,
    .b = {62, 33}
};

您将test.b设置为值为 62 的指针,同时舍弃了额外的初始化器。

第二种情况能够工作是因为您使用temp来初始化b成员,它是一个int数组,会转换为与成员b类型匹配的int指针。

您还可以这样做,它也能工作:

test_struct test = {
    .a = 50,
    .b = (int []){62, 33}
};

然而,指向复合文字的指针仅在其声明的范围内有效。因此,如果在函数内定义了此结构体并返回其副本,则该指针将不再有效。

1
第二个例子中内部的.b值的生命周期是多久?需要使用静态变量吗? - tadman
@tadman 复合字面量的生命周期与其封闭作用域相同。因此,如果test在文件作用域中声明,则复合字面量具有完整的程序生命周期。 - dbush
当然,我指的是代码使用的上下文相关。将其放入函数中,你会有一个“惊喜”。值得一提的是,如果你没有预料到这种情况,这种事情可能会让你犯错。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接