我有一个错误“分段错误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", ¶ms.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*)¶ms) != 0)
{
perror("pthread_create");
exit(1);
}
double *result=0;
pthread_join(arith, (void**)&result);
printf("le resultat du thread : %f",result);
return 0;
}
我不知道有什么问题。
最佳答案
你的代码有几个问题。
首先,MARIT
的签名。它必须采用sinlgevoid*
参数。
其次,somme
和moyenne
声明为指针,但不为它们分配任何内存这就是导致segfault的原因。
第三,返回值必须是一个空指针。这意味着它必须具有指针的大小,并且它指向的值必须在调用之后保持不变(返回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);
关于c - 分段故障11线程程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32689980/