我对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 并返回其副本,则指针将不再有效.

C++相关问答推荐

在C中使用JMP_buf数组进行线程化(在xv6中测试)

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

测量ARM MCU中断延迟的问题

在一个小型玩具项目中实现终端历史记录功能

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

struct 上的OpenMP缩减

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

为静态库做准备中的奇怪行为

将 struct 传递给函数

在Linux上使用vscode和lldb调试用Makefile编译的c代码

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

这个空指针类型的转换是有效代码还是恶意代码?

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

无法理解 fgets 输出

可以从指针数组中的值初始化指针吗?

为什么需要struct in_addr

如何使用 raylib 显示数组中的图像