分段故障11线程程序

弗洛里安

我出现了以下代码错误“ 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;
}

我不知道出什么问题了。

克拉斯·林贝克(KlasLindbäck)

您的代码有两个问题。

首先,的签名MARIT它必须采用一个sinlgevoid*参数。

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

第三,返回值必须是一个空指针。这意味着它必须具有指针的大小,并且它指向的值必须在调用之后持续存在(不能在其中返回自动变量的地址MARIT)。

第四,main期望返回一个双精度型,因此更改的类型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函数完成重新运行值的处理后,它应该执行free该操作。在这种情况下,程序随后立即结束,则实际上没有必要释放内存。

您还需要在以下位置更改printf main

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章