全局写入时出现分段错误

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 文件中应该有一个变量定义。您有多个变量定义,因此变量和互斥锁都不起作用。

【讨论】:

以上是关于全局写入时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试锁定共享内存互斥体时出现分段错误

尝试将广度优先搜索方法写入图形时出现分段错误

写入时出现SIGSEGV分段错误,但不读取?

访问共享进程内存时出现分段错误(核心转储)

将结构插入地图时出现分段错误

删除时出现分段错误