2013-01-02 49 views
0

我正在尝试做一个赋值,其中我使用多个线程对文件中的输入进行排序,但是当我尝试使用结构数组来存储我需要的信息时线程恢复后,我得到了分段错误。根据我的消息来源,我不确定它为什么会导致错误。访问全局数组会导致分段错误

这是主文件,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[]); 

,你可以提供任何帮助将不胜感激。

+0

如果你的阵列可以由多个线程访问,你应该使用互斥保护它(或信号): 请看一看在这个岗位提出的解决方案: http://stackoverflow.com/questions/ 3144349/boost-threads-mutex-array –

回答

0

在行

*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]设置为一个不同的值(但它并不指向有效的内存)。

+0

D'oh!我忘了打电话给realloc。我感觉很傻。非常感谢你,我永远不会发现它。 –

+0

现在你已经明白了,[不要施加'malloc'](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – Joe