gpt4 book ai didi

c - 在 C 中迭代相同类型的结构成员

转载 作者:太空狗 更新时间:2023-10-29 15:10:00 24 4
gpt4 key购买 nike

是否可以使用指针迭代 C 结构,其中所有成员都属于同一类型。下面是一些无法编译的示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
int mem1 ;
int mem2 ;
int mem3 ;
int mem4 ;
} foo ;

void my_func( foo* data )
{
int i ;
int* tmp = data ; // This line is the problem

for( i = 0; i < 4; ++i )
{
++tmp ;
printf( "%d\n", *tmp ) ;
}
}

int main()
{
foo my_foo ;
//
my_foo.mem1 = 0 ;
my_foo.mem2 = 1 ;
my_foo.mem3 = 2 ;
my_foo.mem4 = 3 ;
//
my_func( &my_foo ) ;
return 0 ;
}

假设您的编译器/内核不尝试为缓冲区溢出提供堆栈保护,foo 的成员应该在内存中依次对齐。

所以我的问题是:

我将如何迭代相同类型的 C 结构成员。

最佳答案

大多数使用数组 union 的尝试都容易失败。只要您只使用 int,它们就有很好的工作机会,但对于其他类型,尤其是较小的类型,它们可能会经常失败,因为编译器可以(尤其是较小的类型)在成员之间添加填充struct,但不允许对数组元素这样做)。

但是,C 确实有一个您可以使用的 offsetof() 宏。它产生一个项目在struct中的偏移量,因此您可以创建一个偏移量数组,然后(在转换时要小心)您可以将该偏移量添加到结构的地址以获取成员(member)的地址。 casting中的注意是因为offset是以字节为单位的,所以需要将struct的地址转为char *,然后加上offset,再将结果转为成员的类型(在您的情况下为 int)。

关于c - 在 C 中迭代相同类型的结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1869776/

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