C语言中通过void指针访问结构体首元素是否合法?是否为未定义行为?
关于void指针解引用与结构体成员访问的疑问
我曾搜索过相关内容,但现有资料没能完全解答我的问题。
需求场景
我想实现一个通用函数,用来设置未知类型结构体的特定成员。结构体大致定义如下:
struct x{ type *links[LINK_SIZE]; // 其他数据 };
函数原型为:
somefunc(void *x, void *y, void* z)
这里x是指向struct x的指针,但被转为void*传入。我希望通过解引用这个void*来访问它的第一个成员links。我知道在GCC下所有指针大小相同,而且测试代码在我的环境里能正常运行——解引用结构体指针时确实能获取到第一个成员。但我不确定这种写法是否属于未定义行为?
测试代码
#include <stdlib.h> #include <stddef.h> #include <stdio.h> typedef struct e{ struct e *links[2]; int a; }e; void somefunc(void *x, void *y, void *z) { void **epl = (void **)x; epl[0] = y; // 另外,像普通数组一样访问void指针数组是否可行? epl[1] = z; } int main(void) { e e1 = (e){{NULL, NULL}, 1}; e e2 = (e){{NULL, NULL}, 2}; e e3 = (e){{NULL, NULL}, 3}; somefunc(&e1, &e2, &e3); printf("%d\n", e1.links[0]->a); printf("%d\n", e1.links[1]->a); printf("%d\n", e1.a); return 0; }
补充实际需求
我有两个不同的结构体:
typedef struct e{ struct e *links[2]; int a; }e; typedef struct f{ struct f *links[2]; float a; }f;
我希望用同一个函数就能更新这两个结构体的links成员,而不是为每种结构体单独写类型转换的函数。
内容的提问来源于stack exchange,提问作者Pragmatic
相关产品推荐
相关产品推荐

