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

发布于 2022-09-04 21:19:45 字数 321 浏览 29 评论 0

不同结构体的指针作为参数传递到同一个函数,理论上来说属于不同类型,为什么编译器没有报错?
测试环境: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

枫以 2022-09-11 21:19:45

不会报错,但是有警告。
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

像极了他 2022-09-11 21:19:45

就像楼上说的,你传的参数,无论是A*还是B*,本质上还是一坨地址。既然都是一坨地址,那编译器当然不会管你是哪一坨地址,只是会给你一个警告,告诉你这坨地址可能不是你想要的那一坨地址,仅此而已。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文