2

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

#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;

}
4

2 回答 2

6

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

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

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-
于 2013-05-01T15:24:08.063 回答
2

您的编译器可能会警告您其中一些问题。不要忽略编译器警告!警告是你的编译器告诉你的方式“等等!我不太明白这段代码......请用我理解的语言写出来! ”。你在看哪本书?我看到了这种方法引起的其他问题,我不会在这个问题中提及。通过“反复试验”或“错误的示例”(例如复制/粘贴和修改)来学习 C 是不安全的。你应该读一本教授写的书,教授以编程为生,并且在这方面享有盛誉。请在进一步阅读之前回答这个问题。

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

void *function(void *argument);

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

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

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

void *function(void *oz) {
    char **y = oz;
    *y = "asd";
}

因此,您可能也应该传递 pthread_open 一个char **值。传递一个char *值然后将其视为一个值是没有意义的char **,对吧?无需将任何指向对象的指针转换为void *; 这种转换是自动转换之一。

if (pthread_create(&thread1, NULL, function, &oz)){
    fprintf(stderr, "Error creating thread\n");
    return 1;
}
于 2013-05-01T15:08:40.747 回答