如何将malloced变量传递给结构中的C中新创建的结构

时间:2013-03-25 17:19:59

标签: c struct malloc

我们来看这个例子:

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

5 个答案:

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