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
相关产品推荐
相关产品推荐

