c程序寻址的字节占位问题

一个int类型参数占4个字节,但是为什么这里的c和b这两个参数之间只占了两个字节导致寻址该数据出错呢?🤔

img

在你的系统里,int *占8个字节而不是4个。注意,int *和int是两回事。

1、在C语言中,局部变量通常存储在栈上,它们的地址通常是连续的。但是,这并不是一个强制性的规则,因为编译器可能会对变量进行重新排列以优化性能,因此,不能保证两个局部变量的地址一定是连续的,甚至在不同的系统处理方式也不同,可能出现a、b、c的地址高低是完全相反的。
2、按你代码的逻辑,想实现数据替换的方案,需要让a、b、c的地址连续,可以用结构体封装保证。

    struct Param
    {
        int a = 11;
        int b = 10;
        int c = 15;
    };
    Param par;
    par.a = 11;
    par.b = 10;
    par.c = 15;
    *(&par.b -1) = 20;
    *(&par.b +1) = 0;
    printf("*(&b -1)的地址 :%p\n",&*(&par.b -1));
    printf("*(&b +1)的地址 :%p\n",&*(&par.b +1));
    printf("a的地址 :%p,a的值为:%d \n",&par.a,par.a);
    printf("b的地址 :%p,b的值为:%d \n",&par.b,par.b);
    printf("c的地址 :%p,c的值为:%d \n",&par.c,par.c);

如此得到的答案就是对的。

*(&b -1)的地址 :0x7ffd89dfcb9c
*(&b +1)的地址 :0x7ffd89dfcba4
a的地址 :0x7ffd89dfcb9c,a的值为:20 
b的地址 :0x7ffd89dfcba0,b的值为:10 
c的地址 :0x7ffd89dfcba4,c的值为:0 

如果解决您的问题,请采纳,谢谢。

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^