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



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

funptr已经是一个函数指针。要将其转换为void *,您只需要(void *)funptr。您需要具有void *(*) (void *)类型的第三个参数,而不是将函数强制转换为void*。请参阅pthread_create文档

正如Santhosh在评论中所写的,SIGSEGV的原因是pthread_create()被作为指向同一pthread_t的参数指针。

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

在这两个线程创建中,您都使用pid1。

pthread_join(pid2,NULL);pid2只不过是一个垃圾值。。。

相关内容

  • 没有找到相关文章

最新更新