将指针char参数传递给线程中的函数

时间:2013-05-01 14:46:26

标签: c multithreading function char

当我执行此代码时,我收到了“分段错误(核心愚蠢)”。

#include <pthread.h>
#include <stdio.h>

void function(char *oz){

    char *y;
    y = (char*)oz;
    **y="asd";


    return NULL;
}

int main(){
    char *oz="oz\n";

    pthread_t thread1;

    if(pthread_create(&thread1,NULL,function,(void *)oz)){
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }

    if(pthread_join(thread1,NULL)){
        fprintf(stderr, "Error joining thread\n");
        return 2;
    }
    printf("%s",oz);
    return 0;

}

2 个答案:

答案 0 :(得分:5)

首先,您需要决定如何管理内存:是由调用者分配的内存,还是在线程函数内部。

如果内存是由调用者分配的,那么线程函数将如下所示:

void *function(void *arg)
{
    char *p = arg;
    strcpy(p, "abc"); // p points to memory area allocated by thread creator
    return NULL;
}

用法:

char data[10] = "oz"; // allocate 10 bytes and initialize them with 'oz'
...
pthread_create(&thread1,NULL,function,data);

如果在线程函数内部分配了内存,则需要传递指针指针:

void *function(void *arg)
{
    char **p = (char**)arg;
    *p = strdup("abc"); // equivalent of malloc + strcpy
    return NULL;
}

用法:

char *data = "oz"; // data can point even to read-only area
...
pthread_create(&thread1,NULL,function,&data); // pass pointer to variable
...
free(data); // after data is not needed - free memory-

答案 1 :(得分:2)

您的编译器可能会警告您其中一些问题。不要忽略编译器警告!警告是你的编译器告诉你的方式“坚持!我不太明白这段代码......请用我理解的语言来表达它!”。你正在读哪本书?我看到其他问题,我在这个问题中不会提到这个问题。通过“反复试验”或“误导的例子”(例如复制/粘贴和修改)来学习C是不安全的。你应该读一本教授编程为生的教授写的书,并且这样做有着良好的声誉。请在之前>继续阅读此问题。

pthread_create需要一个函数指针,指示具有如下签名的函数:

void *function(void *argument);

您给它的函数指针将转换为假定该签名的函数指针。然后pthread_create将尝试使用该函数指针,它知道如何...这是未定义的行为。 ...此外,如@AdamRosenfield所示,您无法从返回void 的函数返回值。这应该会导致编译器向您发出错误和警告。您的功能应如下所示:

void *function(void *oz) {
    /* ... */
}

在块中,评论是你问题中的另一系列谎言。您的代码不会出现段错误,因为它无法编译。 ychar * ... *ychar ... **y是编译错误。我假设您只想取消引用一次,但是将"asd"分配给char也没有意义,所以我必须假设您打算将y声明为{{1 }}。你似乎多次使用类型转换。在使用它们之前了解它们,这样您就不会滥用它们或在不需要的地方使用它们(例如尝试将char **y;转换为char * ...跆拳道?)。

char *

因此,您可能也应该将pthread_open传递给void *function(void *oz) { char **y = oz; *y = "asd"; } 值。传递char **值然后将其视为char *值是没有意义的,对吧?没有必要将任何指向对象的指针强制转换为char **;转换是自动转换之一。

void *