gpt4 book ai didi

c - C中嵌套结构的指针类型

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:39 25 4
gpt4 key购买 nike

是否可以在 C 中创建指向嵌套结构的内部结构的指针?

#include <stdio.h>
#include <stdint.h>

typedef struct
{
uint8_t first;
struct
{
uint8_t second;
uint8_t third[8];
} inner_struct;
} outer_struct;

int main()
{
outer_struct foo;
void * p = &foo.inner_struct;
printf("%d", sizeof(p->third));
return 0;
}

使用空指针我可以指向它,但我得到这个错误

main.c: In function 'main':
main.c:26:26: error: request for member 'third' in something not a structure or union
printf("%d", sizeof(p->third));
^~

当试图获取“第三”数组的大小时。我也可以使用指向 outer_struct 的指针,但实际示例是事件嵌套更多并且包含长变量名,使其难以阅读。是否可以直接创建指向内部结构的指针?

使用struct inner_struct * p = &foo.inner_struct; 而不是 void yields

main.c: In function 'main':
main.c:25:31: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
struct inner_struct * p = &foo.inner_struct;
^
main.c:26:26: error: dereferencing pointer to incomplete type 'struct inner_struct'
printf("%d", sizeof(p->inner_struct.third));
^~

最佳答案

void * 类型是一个通用指针,可以指向任何东西。但是编译器实际上不知道它指向什么,因此您必须使用强制转换来告诉它。

因此,要使 p->third 正常工作,您需要将指针 p 转换为正确的指针类型。

不幸的是,这对于您当前的代码是不可能的,因为内部结构是一个没有已知标签(结构名称)的匿名结构。您需要创建一个可用于转换的结构标签。例如

typedef struct
{
uint8_t first;
struct inner_struct
{
uint8_t second;
uint8_t third[8];
} inner_struct;
} outer_struct;

现在你可以转换指针p,比如((struct inner_struct *) p)->third

或者立即将p定义为正确的类型:

struct inner_struct *p = &foo.inner_struct;

关于c - C中嵌套结构的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55967705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com