我的课程分为两部分:
库文件(libprog.c),只有一个函数:
int *
libfunc(void)
{
int *i;
i = malloc (sizeof(int));
printf("in lib, %d\n", *i);
return i;
}
主程序(prog.c):
void *
thr_func(void *arg)
{
int *p;
p = libfunc();
printf("in thr: %d\n", *p);
return (void *)0;
}
int
main(int argc, char **argv)
{
pthread_t tid;
pthread_create(&tid, NULL, thr_func, NULL);
pthread_join(tid, NULL);
return 0;
}
正如您所看到的,我只是创建一个pthread并将thr_func()
函数传递给它,然后调用libfunc()
,它使用malloc()
分配一个整数并返回其指针。
当我运行这个程序时,它会在i
中输出整数libfunc()
,但是当我尝试在thr_func()
中访问它时会出现分段错误,它会给出段错误:
bash-4.1$ ./prog
in lib, 0
Segmentation fault (core dumped)
但是当我使用pthread删除线程创建并直接在thr_func()
中调用main()
时,程序运行成功:
bash-4.1$ ./prog
in lib, 0
in thr: 0
那么pthread如何影响这里访问内存的方式? 我该怎么做才能让它发挥作用?
答案 0 :(得分:1)
问题是你的prog.c编译单元没有看到libfunc
函数的声明。因此,使用以下(默认)声明:
int libfunc();
请注意,这与真实的不同:
int* libfunc();
现在,当从libfunc
调用thr_func
时,返回的int*
指针将被解释为int
,然后在转换为int*
时将其存储在本地p
变量中。将int
强制转换为指针类型的结果是实现定义的。在您的平台上,这会导致混乱的指针值,最终导致分段错误。
要解决此问题,请将以下行添加到prog.c的顶部:
int* libfunc();
或者更好的是,创建一个与libprog.c一起使用的正确头文件。