我有一个链接到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 lockn");
pthread_mutex_lock( &mutex );
for (int x = 0; x < 5; x++)
{
printf("before pointern");
*(ptr+x) = 1;
}
pthread_mutex_unlock( &mutex );
}
首先,跨多个文件共享全局文件是一种可怕的做法。在这种情况下,您可能应该创建包装器函数来处理对该变量的所有访问,包括互斥。在someheader.h中声明那些setter/getter函数,然后仅在someheader.c中定义变量。并使它们成为static
。
如果您确实使用了全局变量(不应该这样做(,那么头文件中应该有一个extern
引用,.c文件中应该只有一个变量定义。您有多个变量定义,因此变量和互斥对象都不起作用。