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

标签 c arrays pointers pthreads segmentation-fault

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

这是主文件 Threads.c 段错误出现在 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[]);

如果您能提供任何帮助,我们将不胜感激。

最佳答案

在行

*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]到一个不同的值(但这也很可能不指向有效的内存)。

关于c - 访问全局数组会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130956/

相关文章:

c - 在结构中使用 posix_memalign 出现段错误

c++ - 实时 2D 渲染到系统内存

c - 指向 int 数组的指针和指向 int 的指针之间的语法差异

c - 链接列表不会删除列表中的第二 (2) 条记录,但适用于所有其他记录

php - 如何检查多维数组中的数组键?

c - 为什么在 C 中不能将二维数组转换为二维指针?

java - 从 Java 方法返回数组

c - 在方法头中后缀变量类型的星号有何意义?

树莓派的交叉编译——包括来自同步文件系统的库

c++ - C/C++ 通过调用引用或直接释放指针