让我们来看看这个例子:
struct args{
char *fname;
}
int main(void){
struct args tArg;
tArg.fname = malloc(10);
strcpy(tArg.fname, "ciao");
pthread_create(&p1, NULL, thread, (void *)&tArg);
pthread_join(p1, NULL);
free(tArg.fname);
return 0;
}
void *thread(void *p1Arguments){
struct args *p1 = p1Arguments;
printf("%sn", p1->fname);
}
printf
进入thread
导致程序出现段故障,因为没有任何东西进入p1->fname
。
我能做什么来传递一个malloc'ed字符串?
EDIT:对不起,我忘了写pthread_join
看起来像:
1)在struct tArg
中正确地分配和初始化了"fname"2)你也正确地传递tArg到你的线程
…但是…
3)在线程访问 "fname"之前,你的主程序释放了 "fname"(糟糕!)
建议:
在创建线程之后添加一个"getchar()"(并且在调用"free()"之前添加),这样main将等待用户在它释放和退出之前点击"ENTER"。
除了等待线程完成之外,正如@Claudiu所述,您还必须强制转换p1Arguments
-这是C语言中少数需要强制转换的地方之一
pthread_create(&p1, NULL, thread, (void *)&tArg);
free(tArg.fname);
是不正确的。
线程应该使用空闲位。
main执行join操作
您正确地传递了。
您的free(tArg.fname);
,但是线程正在尝试使用tArg.fname
.
// ...
pthread_create(&p1, NULL, thread, (void *)&tArg);
pthread_join(p1, NULL); // <-- PUT THIS AND GIVE A MOMENT TO THREAD
free(tArg.fname);
// ...
可能是堆栈问题。
target是在栈上创建的。当你传递tArg地址时(它在主程序的堆栈上),线程有它自己的堆栈段。我有两个建议。
1> try by malloc tArg。将其声明为指向struct的指针。2>或者将tArg定义为全局变量,这将强制它在全局数据区而不是堆栈区分配。