使用pkg-config --libs链接glib时程序段错误,无--libs则正常
问题根源与解决方案
你的代码存在未定义行为,核心问题是main函数中的myInt是未初始化的指针(野指针),两种编译场景的不同表现只是未定义行为的随机结果,和链接参数的顺序/有无glib库无关。
为什么两种编译情况表现不同?
- 仅用
--cflags编译时,程序没有链接glib库,内存布局相对简单,野指针恰好指向了一块当前进程有权限访问的内存区域(比如_rtld_local附近),所以执行赋值操作时没有触发崩溃,但这完全是偶然的运气,不是正确的程序行为。 - 加上
--libs链接glib库后,程序的内存布局发生变化,未初始化的野指针恰好变成了空指针(0x0),此时对空指针的成员赋值mert->a = 5会直接触发段错误,这是未定义行为的另一种典型表现。
修复方案
你需要为指针分配有效的内存空间,有两种常见方式:
方式1:栈上分配结构体实例
直接在栈上创建结构体变量,传递它的地址给函数:
#include <glib.h> typedef struct _mystruct{ int a; }my; static void set_int(my *mert){ mert->a = 5; } int main() { my myInt; // 在栈上分配结构体实例 set_int(&myInt); // 传递地址 }
方式2:堆上动态分配内存
如果需要在堆上分配内存(比如结构体需要在函数外持续存在),可以使用glib的内存分配函数或标准C的malloc:
#include <glib.h> typedef struct _mystruct{ int a; }my; static void set_int(my *mert){ mert->a = 5; } int main() { my *myInt = g_malloc(sizeof(my)); // 用glib的分配函数 // 或者用标准C的malloc:my *myInt = malloc(sizeof(my)); set_int(myInt); g_free(myInt); // 记得释放堆内存,用free()对应malloc() }
额外说明
调整链接参数的位置无法解决问题,因为问题的本质是代码中未初始化的野指针,和链接顺序没有关系。
内容的提问来源于stack exchange,提问作者user18384383
相关产品推荐
相关产品推荐

