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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:55:18