用指针初始化 C 结构

标签 c

我是 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 成员不是数组而是指针。因此,当您尝试像这样初始化时:

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

但是,指向复合文字的指针将只在它被声明的范围内有效。因此,如果您在函数内部定义此结构并返回它的副本,则指针将不再有效。

关于用指针初始化 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73407846/

相关文章:

c - 关于c中的函数重载

C printf 函数数据格式

c - 取消引用 char 指针会导致段错误

在 c 中将字符串分成 512 字节的 block

c - 使用 scanf 一次扫描多个字符和整数

C函数声明

C 单链表使用 gcc 但不使用 dcc 出现段错误

java - 为什么 C 和 Java 的表达式 m++ + (++m) 的输出不同

c - C中的结构矩阵

c - 在 C 中求和并查找数组的非零项