【发布时间】:2014-07-23 00:01:04
【问题描述】:
考虑以下代码:
void* run(void* arg) {
int* array=(int*)arg;
printf("In run!\n");
int i;
for (i=0; i<10; i++) {
printf("%d ",array[i]);
}
printf("\n");
return (void*)15;
}
int main() {
pthread_t my_thread;
int array[10]={0};
void* ret;
int i;
for (i=0; i<10; i++) {
array[i]=i+1;
}
if (pthread_create(&my_thread, NULL, run, (void*)array)!=0) {
perror("thread creation failed");
return 1;
}
pthread_join(my_thread, &ret);
printf("thread finished and returned %d\n", *(int*)ret); // segfault. why??
return 0;
}
我正在尝试获取由创建的线程返回的值 15,但由于某种原因,最后一个 printf 引发了分段错误。
分段错误的原因是什么,获取返回值15的正确方法是什么?
我也试过这个:printf("thread finished and returned %d\n", *(*(int*)ret));
这导致了一个错误:
错误:一元‘*’的无效类型参数(有‘int’)
还有这个:printf("thread finished and returned %d\n", *(int*)(*ret));
这也导致了错误(和警告):
警告:取消引用‘void *’指针[默认启用]
错误:无效使用无效表达式
什么是正确的方法,最重要的是,该段错误的原因是什么?
【问题讨论】:
-
代码正在取消引用不允许访问的内存。也许
printf("thread finished and returned %p\n", ret);打印指针。