使用函数指针时出现分段错误

时间:2015-03-24 06:05:35

标签: c segmentation-fault function-pointers

当我在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;
}

当我在funptr内声明main()时,它会给我正确的输出。想知道究竟是什么问题。

问题在于线程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;
}

2 个答案:

答案 0 :(得分:3)

funptr已经是一个函数指针。要将其投放到void *,您只需要(void *)funptr。您需要具有void *(*) (void *)类型的第三个参数,而不是将您的函数转换为void*。见pthread_create documentation

正如Santhosh在评论中写的那样,SIGSEGV的原因是pthread_create()被赋予指向同一pthread_t的参数指针。

答案 1 :(得分:0)

pthread_create(&pid1,NULL,(void *)(*funptr),(void *)msg1);
pthread_create(&pid1,NULL,(void *)(*funptr),(void *)msg2);

在线程创建中,您正在使用pid1。

在pthread_join(PID2,NULL); pid2只是持有垃圾价值......