【发布时间】: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。这种情况不会经常发生,但一旦发生,错误几乎是难以理解的,所以最好不要冒险。
标签: c++ c segmentation-fault global-variables