访问全局数组会导致分段错误

Posted

技术标签:

【中文标题】访问全局数组会导致分段错误【英文标题】:Accessing a global Array causes a segmentation fault 【发布时间】:2013-01-02 23:35:11 【问题描述】:

我正在尝试执行一项分配,在该分配中我将使用多个线程对文件中的输入进行排序,但是当我尝试使用结构数组来存储我需要在线程之后恢复的信息时,我得到一个分段故障。根据我的消息来源,我不确定它为什么会导致故障。

这是主文件,Threads.c seg 错误在 for 循环中,导致的行由注释指定。排序方法是另一个我没有的函数

#include "threads.h"
Threads* threadArray[4];
int linesPerThread;
int extraLines;

main(int argc, char *argv[])
 int n;

 if( argc != 4)
  printf("Wrong Number of Arguements!\n");
  return;

  n = atoi(argv[1]);
 char *inName = argv[2];



*threadArray = (Threads*) (*threadArray, n*sizeof(Threads));  




FILE* file = fopen(inName, "r");
 if(!file)
printf("invalid file Name \n");
return;

int lines = 0;
char xyz[5000]; //makes fgets happy
while(fgets(xyz, 5000, file) != NULL)
  lines = lines+1;

fclose(file);
linesPerThread = lines / n;


 extraLines = lines - linesPerThread;

 int i =0;
 int methodCounter =1;


 printf("Right before Loop \n \n");

 for(i; i < n; i++)

   printf("first part of loop \n");
 \\The ling below here Seg Faults.
   (*threadArray + i)->id = i;

   printf("right after first ThreadArray access \n");
   if(methodCounter < 3)
 printf("method counter 1\n");
(*threadArray+i)->methodID = methodCounter;
 methodCounter++;
   else
 printf("method counter condition 2 \n");
(*threadArray + i)->methodID = 3;
   methodCounter = 1;
   if(extraLines > 0)
 printf("extra Lines condition 1 \n");
(*threadArray+i)->lines = linesPerThread +1;
 extraLines= extraLines -1;
   else
 printf("extraLines condition 2 \n");
 (*threadArray+i)->lines = linesPerThread;
   
   printf("Right before Thread Creation \n \n");
   pthread_t tID;
   pthread_create(&tID, NULL, sortMethod, (void*) &((*threadArray+i)->id));
   (*threadArray+i)->threadID = tID;
   printf("right after thread creation \n \n");
 
 printf("right after loop \n \n");
 int c=0;

 printf("before thread joining \n");
 for(c; c< n; c++)
   pthread_join( (*threadArray+ c)->threadID, NULL);
 


 

这是头文件,Threads.h

#include <sys/time.h>
#include <stdio.h> 
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

typedef struct
  int id;
  int lines;
  pthread_t threadID;
  int methodID;
Threads;

void* sortMethod(void*ptr);
int main(int argc, char *argv[]);

您能提供的任何帮助将不胜感激。

【问题讨论】:

如果您的数组可以被多个线程访问,您应该使用互斥锁(或信号量)保护它:请查看这篇文章中提出的解决方案:***.com/questions/3144349/boost-threads-mutex-array 【参考方案1】:

排队

*threadArray = (Threads*) (*threadArray, n*sizeof(Threads));  

您将threadArray[0] 设置为(Threads*)(n*sizeof(Threads)。您可能需要在该行中使用 realloccalloc

就目前而言,

(*threadArray, n*sizeof(Threads))

是一个逗号表达式,该逗号表达式的值被转换为Threads*

由于您从未为threadArray 的任何元素分配内存,

(*threadArray + i)->id = i;

取消引用无效指针。由于数组是静态的,因此指针最初被初始化为空指针,您只需将 threadArray[0] 设置为不同的值(但很可能也不指向有效内存)。

【讨论】:

天啊!我忘了打电话给realloc。我觉得很傻。非常感谢,我永远不会发现它。 现在你已经明白了,do not cast malloc

以上是关于访问全局数组会导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

delete[] 运算符在非常简单的情况下导致分段错误

全局指针导致分段错误?

C - 将结构写入二维数组会导致分段错误

为啥我的字符串分配会导致分段错误?

为啥释放内存会导致分段错误?

初始化数组时出现段错误