3

让我们看这个例子:

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);
}

printfinto导致程序出现段错误,thread因为没有 into p1->fname
我能做些什么来传递一个 malloc 的字符串?

编辑:对不起,我忘了写pthread_join

4

5 回答 5

1

看起来像:

1)您在 struct tArg 中正确分配和初始化“fname”

2)您也正确地将 tArg 传递到您的线程中

... 但 ...

3)您的主程序在线程访问它之前取消分配“fname”(糟糕!)

建议:

在创建线程之后(以及在调用“free()”之前)放置一个“getchar()” ,以便 main 在它释放之前和退出之前等待用户点击“ENTER”。

于 2013-03-25T17:22:34.863 回答
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);

// ...
于 2013-03-25T17:23:30.500 回答
1

除了等待线程完成之外,正如@Claudiu 所述,您还必须强制转换p1Arguments- 这是 C 语言中少数需要强制转换的地方之一。

于 2013-03-25T17:23:48.913 回答
1

想法是

pthread_create(&p1, NULL, thread, (void *)&tArg);
free(tArg.fname);

是不正确的。

线程应该做空闲位。

主要做一个连接

于 2013-03-25T17:24:46.550 回答
0

可能是堆栈问题。

您传递的目标是在堆栈上创建的。当您传递 tArg 地址(位于主程序的堆栈上)时,线程有自己的堆栈部分。我建议你两种解决方案。

1> 通过 malloc tArg 本身尝试。将其声明为指向结构的指针。2> 或将 tArg 定义为全局变量,这将强制它分配在全局数据部分而不是堆栈部分。

于 2013-03-25T17:38:02.237 回答