相关疑难解决方法(0)

C函数指针转换为void指针

我试图运行以下程序,但得到一些奇怪的错误:

档案1.c:

typedef unsigned long (*FN_GET_VAL)(void);

FN_GET_VAL gfnPtr;

void setCallback(const void *fnPointer)
{
    gfnPtr = *((FN_GET_VAL*) (&fnPointer));
}
Run Code Online (Sandbox Code Playgroud)

档案2.c:

extern FN_GET_VAL gfnPtr;

unsigned long myfunc(void)
{
    return 0;
}

main()
{
   setCallback((void*)myfunc);
   gfnPtr(); /* Crashing as value was not properly 
                assigned in setCallback function */
}
Run Code Online (Sandbox Code Playgroud)

这里使用gcc编译时,gfnPtr()在64位suse linux上崩溃.但它成功调用了gfnPtr()VC6和SunOS.

但如果我改变下面给出的功能,它就能成功运行.

void setCallback(const void *fnPointer)
{
    int i; // put any statement here
    gfnPtr = *((FN_GET_VAL*) (&fnPointer));
}
Run Code Online (Sandbox Code Playgroud)

请帮助解决问题的原因.谢谢.

c pointers function-pointers

20
推荐指数
3
解决办法
2万
查看次数

为什么我不能将函数指针转换为(void*)?

我有一个函数,它接受一个字符串,一个字符串数组和一个指针数组,并在字符串数组中查找字符串,并从指针数组中返回相应的指针.因为我将它用于几个不同的东西,指针数组被声明为(void*)的数组,并且调用者应该知道实际上有什么类型的指针(因此它返回的返回值是什么类型的指针) ).

但是,当我传入一个函数指针数组时,在编译时会收到警告-Wpedantic:

铛:

test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
      between void pointer and function pointer [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)

GCC:

test.c:40:8: warning: ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
   fptr = find_ptr("quux", name_list, (void **)ptr_list,
Run Code Online (Sandbox Code Playgroud)

这是一个测试文件,尽管警告确实正确打印"quux":

#include <stdio.h>
#include <string.h>

void foo(void)
{
  puts("foo");
}

void bar(void)
{
  puts("bar");
}

void quux(void)
{
  puts("quux");
}

typedef void (* voidfunc)(void);

voidfunc ptr_list[] = {foo, bar, quux};

char *name_list[] = {"foo", "bar", …
Run Code Online (Sandbox Code Playgroud)

c pointers function-pointers

11
推荐指数
4
解决办法
7897
查看次数

标签 统计

c ×2

function-pointers ×2

pointers ×2