代码之家  ›  专栏  ›  技术社区  ›  MK.

关于C函数指针的警告

  •  1
  • MK.  · 技术社区  · 14 年前

    我有以下代码:

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef void (*func_t)(void * data);
    
    void func2(int * arg, func_t free_func) {
            free_func(arg);
    }
    
    void func(int * a) {
            printf("%d\n", *a);
    }
    
    int main(int argc, char ** argv) {
            int a = 4;
            func2(&a, func);
            return 0;
    }
    

    为什么?int指针不应该与void指针兼容吗?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Cratylus    14 年前

    您也可以这样做:

    free_func((int *)arg);
    

    不安全的

    例如

    char i = 0;
    char j = 0;    
    char* p = &i;
    void* q = p;
    int* pp = q;    /* unsafe, legal C, not C++ */
    printf("%d %d\n",i,j);
    *pp = -1;   /* overwrite memory starting at &i */
     printf("%d %d\n",i,j);
    
        2
  •  3
  •   cdhowie    14 年前

    您可以强制转换类型并不意味着编译器会乐意为您这样做。

    在这种情况下,函数指针定义不匹配。C不会假设一个函数声明为 int* void* ,即使这两种类型之间的转换是隐式的。这是C如何处理函数指针的一个微妙的问题。

    如果你想让它在没有警告的情况下工作,你必须像这样:

    func2(%a, (func_t)func);
    
        3
  •  1
  •   John Bode    14 年前

    指针类型只有在其基类型兼容时才兼容,并且 int void 不兼容。

        4
  •  0
  •   pmg    14 年前

    void func(void * a) {
            printf("%d\n", *(int*)a);
    }
    

    一切都如你所料。