全局写入时出现分段错误
Posted
技术标签:
【中文标题】全局写入时出现分段错误【英文标题】:Segmentation fault on writing on global 【发布时间】:2022-01-03 09:36:10 【问题描述】:我有一个链接到 main.c 的 c++ 库。
在两个文件之间使用了一个全局变量。
变量声明在sharedata.h
#ifndef __SHARE_DATA_H__
#define __SHARE_DATA_H__
#include <stdio.h>
#include <pthread.h>
#ifdef __cplusplus
extern "C"
#endif
// declare your two vars in the header file as extern.
extern pthread_mutex_t mutex;
extern int *ptr;
#ifdef __cplusplus
#endif
#endif /* __SHARE_DATA_H__ */
在main.c
里面,我有ptr
的声明和内存分配。我可以read and print of data in *ptr
。
main.c
#include "sharedata.h"
pthread_mutex_t mutex;
int *ptr;
int main()
pthread_mutex_lock( &mutex );
ptr = (int *)malloc((4 * 5) * sizeof(int));
pthread_mutex_unlock( &mutex );
/*do some other things
%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
*/
pthread_mutex_lock( &mutex );
for (int x = 0; x < 5; x++)
printf("%d ", *(ptr+x));
printf("\n");
pthread_mutex_unlock( &mutex );
在gstdsexample.cpp
里面,我有全局变量的声明和初始化。
但是当我尝试将数据写入 *ptr 时,我在这一行有 segmentation fault
*(ptr+x) = 1;
有什么问题?
#include "sharedata.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int *ptr;
printf("before lock\n");
pthread_mutex_lock( &mutex );
for (int x = 0; x < 5; x++)
printf("before pointer\n");
*(ptr+x) = 1;
pthread_mutex_unlock( &mutex );
【问题讨论】:
您在两个源文件中定义了变量 - 违反了一个定义规则 (ODR)。选择一个,从另一个中删除定义。 如果我没有在main.c中定义,我在编译中有未定义的引用错误。 你在链接gstdsexample.cpp
吗?它看起来不对 - 在任何函数之外都有代码。它不应该编译。最有可能的是,您只编译了main.c
,但由于mutex
未初始化而导致编译失败;在 C 中,你应该调用 pthread_mutex_init
是的,我将 gstdsexample.so 链接到 main.c。这只是整个代码的一小部分。
当您在 C++ 标识符中连续使用两个下划线时,things can get weird。这种情况不会经常发生,但一旦发生,错误几乎是难以理解的,所以最好不要冒险。
【参考方案1】:
首先,跨多个文件共享全局文件是一种糟糕的做法。在这种情况下,您可能应该创建包装函数来处理对该变量的所有访问,包括互斥锁。在 someheader.h 中声明这些 setter/getter 函数,然后在 someheader.c only 中定义变量。并让他们static
。
如果您确实使用了全局变量(您不应该这样做),那么头文件中应该有一个 extern
引用,而 .c 文件中应该有一个变量定义。您有多个变量定义,因此变量和互斥锁都不起作用。
【讨论】:
以上是关于全局写入时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章