2016-11-28 2 views
2

Я попытался запустить этот код в терминале в OSX и Linux Ubuntu:с ошибкой в ​​сбое сегментации массива

#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
int fact=1; //this data is shared by thread(s) 
int n; 
int x; 
int *arrayName; 

int main(int argc, char *argv[]) 
{ 

    if (argc != 3){ //check number of arguments 
     printf("Must use: a.out <integer value>\n"); 
     return -1; 
    } 
    int x = atoi(argv[1]); 
    n = atoi(argv[2]); 
    if (n < 0){ //check second passed argument 
     printf("%d Must be >=0\n", atoi(argv[2])); 
     return -1; 
    } 
    arrayName = (int *) malloc(n * sizeof(int)); 
    pthread_t tid[n]; 

    for(int i=0;i<n;i++){ 
     pthread_create(&tid[i], NULL, (void *) i, NULL); 
    } 
    int i=0; 
    while(i<n){ 
     pthread_join(tid[i],NULL); 
     i++; 
    } 
    i=0; 
    while (i<n) { 
     printf("Thread is %d",arrayName[i]); 
     i++; 
    } 
} 
void *calculateMult(void *i) { 
    int j = (int) i; 
    arrayName[j] = x * j; 
    return NULL; 
}; 

Я побежал эти команды в терминале:

куб.см -pthread main.c

./a.out 1 1

Но это дает мне ошибку сегмента: 11 в OSX и неисправности сегмента (ядро сбрасывали) в Linux, ПОЧЕМУ ??

+0

'if (argc! = 3)' ehhh? для _a.out <целое значение> _ ?? –

+0

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

, чтобы проверить, превышает ли число аргументов более 3. –

ответ

0

В коде, вы звоните

pthread_create(&tid[i], NULL, (void *) i, NULL); 

где, третий аргумент i является int но ожидаемый аргумент типа void *(*start_routine) (void *). Это вызывает undefined behavior.

Вам нужно указать указатель на функцию, что-то вроде calculateMult или аналогично.

1

Мне кажется, вам нужно позвонить pthread_create, потому что вы прошли неправильный аргумент в pthread_create. Также проверьте возврат с pthread_create.

Вам нужно что-то вроде этого

int s = pthread_create(&tid[i], NULL, (void *)calculateMult, (void *)&i); 
if (s != 0) 
     printf("pthread_create failed"); 

Кроме того, необходимо изменить функцию:

void *calculateMult(void *i) { 
    int *j = (int*) i; 
    arrayName[*j] = x * (*j); 
    return NULL; 
}; 

так что вы сделали.

+0

Спасибо, что работает. –

+0

@jassimabdrhman, затем переверните и примите ответ ..... чувак – Mohan

Смежные вопросы