You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:55:16