当我执行此代码时,我收到了“分段错误(核心愚蠢)”。
#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;
}
答案 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) {
/* ... */
}
在块中,评论是你问题中的另一系列谎言。您的代码不会出现段错误,因为它无法编译。 y
是char *
... *y
是char
... **y
是编译错误。我假设您只想取消引用一次,但是将"asd"
分配给char
也没有意义,所以我必须假设您打算将y
声明为{{1 }}。你似乎多次使用类型转换。在使用它们之前了解它们,这样您就不会滥用它们或在不需要的地方使用它们(例如尝试将char **y;
转换为char *
...跆拳道?)。
char *
因此,您可能也应该将pthread_open传递给void *function(void *oz) {
char **y = oz;
*y = "asd";
}
值。传递char **
值然后将其视为char *
值是没有意义的,对吧?没有必要将任何指向对象的指针强制转换为char **
;转换是自动转换之一。
void *