【发布时间】:2015-03-24 06:05:35
【问题描述】:
在 main() 之前声明函数指针时出现分段错误 并为其分配 main 中函数的地址。如果函数指针在 main() 之前声明,实际会出现什么问题?
代码如下:
#include <stdio.h>
#include <pthread.h>
void fun1(char *str)
{
printf("%s",str);
}
void (* funptr)(char *);
int main()
{
char msg1[10]="Hi";
char msg2[10]="Hello";
pthread_t pid1, pid2;
funptr=&fun1;
pthread_create(&pid1,NULL,(void *)(*funptr),(void *)msg1);
pthread_create(&pid1,NULL,(void *)(*funptr),(void *)msg2);
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
而当我在 main() 中声明 funptr 时,它会给我正确的输出。想知道到底是什么问题。
问题出在线程 ID 上。我对两个线程都使用了相同的线程 ID“pid1”,并且我试图加入“pid2”,这也导致了分段错误。以下是修正后的代码...
#include <stdio.h>
#include <pthread.h>
void fun1(char *str)
{
printf("%s",str);
}
void (* funptr)(char *);
int main()
{
char msg1[10]="Hi";
char msg2[10]="Hello";
pthread_t pid1, pid2;
funptr=&fun1;
pthread_create(&pid1,NULL,(void *)(*funptr),(void *)msg1);
pthread_create(&pid2,NULL,(void *)(*funptr),(void *)msg2);
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
return 0;
}
【问题讨论】:
-
pthread_create 具有相同的 pid,因此崩溃。
-
不管怎样,函数和指针都是错误的。它们应该匹配
void* (*)(void*)。停止强制转换并正确声明您的函数和指针。
标签: c segmentation-fault function-pointers