如何将错位变量传递到一个结构体到一个新创建的结构体



让我们来看看这个例子:

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定义为全局变量,这将强制它在全局数据区而不是堆栈区分配。

相关内容

  • 没有找到相关文章

最新更新