C/C++混编写入全局变量触发Segmentation fault问题求解
问题原因
你遇到的段错误核心是多重定义全局变量导致两个编译单元使用的不是同一份变量,结合执行顺序错误两个层面的问题:
- 全局变量重复定义
头文件中已经用extern声明mutex和ptr是外部全局变量,意味着这两个变量仅能在一个编译单元中定义,其他编译单元直接通过头文件声明引用即可。你现在在main.c和gstdsexample.cpp中分别定义了一次这两个变量,链接时部分编译器不会直接报错,但实际上C文件和C++文件操作的是两份完全独立的变量:main.c里的ptr确实分配了内存,但gstdsexample.cpp里的ptr是未赋值的野指针,直接写入自然触发段错误。
同时两个文件里的mutex也不是同一个锁,完全起不到变量保护的作用,且main.c中定义的mutex没有初始化,行为未定义。 - 执行顺序错误
就算修复了重复定义的问题,如果gstdsexample.cpp中的写入逻辑是在全局对象构造阶段(早于main函数执行)触发的,此时main还没给ptr分配内存,ptr还是NULL,访问也会触发段错误。
修复方案
- 删除多余的全局变量定义:删掉
gstdsexample.cpp中的pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;和int *ptr;两行,仅保留main.c中的一份定义即可。 - 修正锁初始化:将
main.c中的pthread_mutex_t mutex;改为pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;,避免锁未初始化的未定义行为。 - 调整执行逻辑:保证
gstdsexample.cpp中对ptr的写入操作,一定是在main函数完成ptr的内存分配之后再执行。
内容的提问来源于stack exchange,提问作者batuman
相关产品推荐
相关产品推荐

