c - 不同结构体的指针作为参数传递到同一个函数,两种结构体是不同类型,为什么没有报错?

查看:339
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆