分段错误11线程程序

时间:2015-09-21 07:51:54

标签: c multithreading algorithm pointers

我遇到错误“Segmentation fault 11”,代码如下: 我创建了一个为参数提供结构的线程。

我认为问题出在函数*MARIT的声明中。

抱歉我的英语不好我是法国人。

struct parametres {
        double *T;
int N; //taille
};

void *MARIT(struct parametres parametres)
{
int *somme =0;
float *moyenne = 0;
int i;
for(i = 0; i < parametres.N; i++)
*somme = *somme + parametres.T[i];
printf("somme : %d",somme);
*moyenne = (*somme/(parametres.N+0.0));
pthread_exit(moyenne);
}`


int main(int argc, char* argv[])
{
float temps;
clock_t t1, t2;
t1 = clock();
struct parametres params;
printf("Salut à toi !\n");
printf("Donnez la taille du tableau :" );
scanf("%d", &params.N);
params.T = malloc( params.N * sizeof(double) );
int i = 0;
int nombre_aleatoire = 0;
for(i=0; i<params.N; i++){
nombre_aleatoire =  (rand() % 1000) + 1;
params.T[i]=nombre_aleatoire;
}
pthread_t arith,quadrat,cubi;
if(pthread_create(&arith, NULL, MARIT, (void*)&params) != 0)
{
perror("pthread_create");
exit(1);
}
double *result=0;
pthread_join(arith, (void**)&result);
printf("le resultat du thread : %f",result);

return 0;
}

我不知道这是什么问题。

3 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。

首先,MARIT的签名。它必须采用sinlge void*参数。

其次,sommemoyenne被声明为指针,但您没有为它们分配任何内存。这就是导致段错误的原因。

第三,返回值必须是void指针。这意味着它必须具有指针的大小,并且它指向的值必须在调用之后保持不变(在MARIT内返回自动变量的地址是不正确的。)

第四,main期望返回一个double,因此更改moyenne的类型。

修复所有这三个问题可以这样做:

void *MARIT(void *param)
{
    struct parametres *parametres = (struct parametres*)param;
    int somme =0;
    double moyenne = 0, *ret;
    int i;
    for(i = 0; i < parametres->N; i++)
        somme = somme + parametres->T[i];
    printf("somme : %d",somme);
    moyenne = (somme/(parametres->N+0.0));
    ret = malloc(sizeof ret);
    *ret = moyenne;
    pthread_exit(ret);
}

注意,当main函数处理完retrun值时,它应该free。在这种情况下,程序在之后结束,释放内存并不是必需的。

您还需要更改main中的printf:

printf("le resultat du thread : %f", *result);

答案 1 :(得分:0)

int *somme =0;

...

*somme = ... // segmentation fault here

因为您将somme声明为指针(此外还为NULL指针),指向未分配的内存。解决方案:int somme = 0;

同样可变的moyenne:float moyenne = 0;

答案 2 :(得分:0)

> SYNOPSIS
>        #include <pthread.h>
> 
>        int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
>                           void *(*start_routine) (void *), void *arg);

你的功能必须有像

这样的签名
void * start_routine (void *);

错误的那一刻几乎所有东西都是未定义的行为。 并且你必须总是在指向* somme的空间操作之前为指针分配内存,* moyenne因同样的原因而崩溃。虽然我完全没有意识到你选择使用指针而不是普通变量。

  void *MARIT(void *arg)  // change <--here
      {
          struct parametres *parametres = (struct parametres *) arg;  // change <--here
          int *somme = malloc(sizeof(int)); // change <-- here
          float *moyenne =  malloc(sizeof(float)); // change <-- here

          int i;
          for(i = 0; i < parametres->N; i++)  // change <--here
              *somme = *somme + parametres->T[i];  // change <--here
          printf("somme : %d",somme);
          *moyenne = (*somme/(parametres->N+0.0));  // change <--here
          pthread_exit(moyenne);
      }`