我们来看这个例子:
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("%s\n", p1->fname);
}
printf
thread
导致程序陷入段错误,因为p1->fname
没有任何内容。
我该怎么做才能传递malloc'ed字符串?
编辑:对不起,我忘了写pthread_join
答案 0 :(得分:1)
看起来像:
1)您正确地在struct tArg
中分配和初始化“fname”2)你也正确地将tArg传递给你的线程
......但是......
3)你的主程序在线程访问之前解除分配“fname”(不好!)
建议:
在创建线程后放置一个“getchar()”(并且 BEFORE 你调用“free()”),这样main将等待用户在释放之前点击“ENTER”在它退出之前。
答案 1 :(得分:1)
你正确传递了它。
您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);
// ...
答案 2 :(得分:1)
除了等待线程完成之外,正如@Claudiu所说,你还必须施放p1Arguments
- 这是C语言中必须使用强制转换的少数几个地方之一。
答案 3 :(得分:1)
想法是
pthread_create(&p1, NULL, thread, (void *)&tArg);
free(tArg.fname);
不正确。
线程应该执行空闲位。
主要进行加入
答案 4 :(得分:0)
可能是堆栈问题。
你传递的targ是在堆栈上创建的。当你传递tArg地址(在主程序的堆栈上)时,线程有自己的堆栈部分。我建议你两个解决方案。
1&GT;尝试使用malloc tArg本身。将其声明为struct的指针。 2 - ;或者将tArg定义为全局变量,这将强制它在全局数据部分而不是堆栈部分上分配。