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

C语言共用体数组访问成员出现段错误问题求助

问题排查:共用体数组访问时的段错误原因及修复

你遇到的这个段错误,核心问题是对C语言中共用体(union)的特性理解偏差——共用体的所有成员共享同一块内存空间,同一时刻只有一个成员的赋值是有效的,其他成员的值会被后续的赋值彻底覆盖。

咱们来看你的代码问题出在哪:
你初始化共用体数组的代码是这样的:

union Function functions[] = {
    {.name = "acos", .fnct = acos, .args = 1},
    {.name = "asin", .fnct = asin, .args = 1},
    {.name = "atan", .fnct = atan, .args = 1},
};

这里你试图给同一个共用体实例的三个成员name、fnct、args同时赋值,但共用体的内存是完全重叠的:

  • 第一步给.name赋值字符串指针,此时内存里存的是这个指针;
  • 第二步给.fnct赋值函数指针,直接把.name所在的内存区域覆盖了;
  • 第三步给.args赋值int,又把.fnct的内存给覆盖了。

所以当你在循环里访问functions[i].name时,这个“指针”已经不是原来指向"acos"的有效地址了,而是被覆盖后的无效内存,自然会触发段错误。

修复方案

如果你需要同时存储函数名、函数指针和参数个数这三个不同的数据,你应该用**结构体(struct)**代替共用体——结构体的每个成员都有独立的内存空间,不会互相覆盖。修改后的代码如下:

struct Function { char* name; double (*fnct)(); int args; };
struct Function functions[] = {
    {.name = "acos", .fnct = acos, .args = 1},
    {.name = "asin", .fnct = asin, .args = 1},
    {.name = "atan", .fnct = atan, .args = 1},
};

再运行你原来的循环代码,就能正常打印参数个数和函数名了。

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:27:42