函数指针的强转
来源: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回答
-
强转要注意类型兼容性。int 和 double 根本不是兼容的类型,强转是危险行为。
第一个例子,本质上是把 int * 强转成了 double *,然后又把 double * 指向的内容取出来按照 int 去打印,实际上访问的还是最开始的那个 int,因此值是 10。
第二个例子,把int作为参数入栈,是 4个 字节,取的时候则取了 8 个字节,实际上已经出现了内存的非法访问了,然后又按照整型去输出,又把这 8 个字节截断。最后结果是 0 其实是没有意义的,不同的编译器会有不同的实现。
生产环境中千万不要这么写。。。
012021-03-15 -
bennyhuo
2021-03-16
我用gcc运行了一下你的程序,根本就不是你说的结果。实际上由于你的代码本身就是错误得写法,不同编译器的结果不一样页数合理的。不要纠结这种问题了。
00
相似问题
关于函数的参数需要传双重指针的原因
回答 1
结构体类型强转
回答 2