函数指针的强转

来源:16-11 实现下载任务列表-1

wxz123

2021-03-15

#include <stdio.h>
void zc(double *s) {
    printf("%d\n", *s);
}
typedef void (*Func)(int *);

int main(int argc, char *argv[]) {
    Func ee = (void (*)(int *)) zc;
    int a = 10;
    int *zzz = &a;
    ee(zzz);
}
结果:10
#include <stdio.h>
void zc(double s) {
    printf("%d\n", s);
}
typedef void (*Func)(int);

int main(int argc, char *argv[]) {
    Func ee = (void (*)(int)) zc;
    int a = 10;
    ee(a);
}
结果:0

老师,函数指针的强转的过程是怎样的呢?为啥上面两段代码的输出不同呢?

写回答

2回答

bennyhuo

2021-03-15

强转要注意类型兼容性。int 和 double 根本不是兼容的类型,强转是危险行为。

第一个例子,本质上是把  int * 强转成了 double *,然后又把 double * 指向的内容取出来按照 int 去打印,实际上访问的还是最开始的那个 int,因此值是 10。

第二个例子,把int作为参数入栈,是 4个 字节,取的时候则取了 8 个字节,实际上已经出现了内存的非法访问了,然后又按照整型去输出,又把这 8 个字节截断。最后结果是 0 其实是没有意义的,不同的编译器会有不同的实现。

生产环境中千万不要这么写。。。

0
1
wxz123
非常感谢!
2021-03-15
共1条回复

bennyhuo

2021-03-16

我用gcc运行了一下你的程序,根本就不是你说的结果。实际上由于你的代码本身就是错误得写法,不同编译器的结果不一样页数合理的。不要纠结这种问题了。

0
0

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程