c - 不同结构体的指针作为参数传递到同一个函数,两种结构体是不同类型,为什么没有报错?
本文介绍了c - 不同结构体的指针作为参数传递到同一个函数,两种结构体是不同类型,为什么没有报错?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
不同结构体的指针作为参数传递到同一个函数,理论上来说属于不同类型,为什么编译器没有报错?
测试环境: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);
}
代码命名很随意,不要介意。望大神答疑解惑!
解决方案
不会报错,但是有警告。
C语言并不认为这是错误的做法,它会觉得这是程序员故意这么搞的...因为C语言编译器充分相信程序员...
回到这个问题,
当你将mA
传递给这个函数时,
void test(B* b){
b->c;
}
这个函数就将mA
当成了B
来处理, b->c
无非就是访问&b + 4B
所在的地址. 而这里的b
又恰好是传入的mA
, 所以就是访问&ma + 4B
的地址.
我添加了几个printf
在你的代码中, 这些printf
会打印出相应的地址:
typedef struct First{
int a;
}A;
typedef struct Second{
int b;
int c;
}B;
void test(B* b){
printf("B_ddr = %x, B_c_addr = %x\n" , b, &b->c);
}
int main(){
A mA;
mA.a = 1;
printf("A_addr = %x, A_a_addr = %x\n", &mA, &mA.a);
test(&mA);
输出结果:
A_addr = 28ff3c, A_a_addr = 28ff3c
B_ddr = 28ff3c, B_c_addr = 28ff40
可以看出, 最后访问的地址就是 28ff3c + 4 = 28ff40
这篇关于c - 不同结构体的指针作为参数传递到同一个函数,两种结构体是不同类型,为什么没有报错?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文