不同结构体的指针作为参数传递到同一个函数,两种结构体是不同类型,为什么没有报错?
不同结构体的指针作为参数传递到同一个函数,理论上来说属于不同类型,为什么编译器没有报错?
测试环境:visual studio 2013
贴上代码:(C语言)
typedef struct First{
int a;
}A;
typedef struct Second{
int b;
int c;
}B;
void test(B* b){
b->c;
}
main(){
A mA;
mA.a = 1;
test(&mA);
}
代码命名很随意,不要介意。望大神答疑解惑!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不会报错,但是有警告。
C语言并不认为这是错误的做法,它会觉得这是程序员故意这么搞的...因为C语言编译器充分相信程序员...
回到这个问题,
当你将
mA
传递给这个函数时,这个函数就将
mA
当成了B
来处理,b->c
无非就是访问&b + 4B
所在的地址. 而这里的b
又恰好是传入的mA
, 所以就是访问&ma + 4B
的地址.我添加了几个
printf
在你的代码中, 这些printf
会打印出相应的地址:输出结果:
可以看出, 最后访问的地址就是
28ff3c + 4 = 28ff40
就像楼上说的,你传的参数,无论是
A*
还是B*
,本质上还是一坨地址。既然都是一坨地址,那编译器当然不会管你是哪一坨地址,只是会给你一个警告,告诉你这坨地址可能不是你想要的那一坨地址,仅此而已。