一个int类型参数占4个字节,但是为什么这里的c和b这两个参数之间只占了两个字节导致寻址该数据出错呢?🤔
在你的系统里,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
如果解决您的问题,请采纳,谢谢。
【相关推荐】
输入样例
2
5 5
1 2 3 4 5
1 2 3 4 5
3 3
2 4 8
3 6 9
输出样例
5 5 4 4 3 3 2 2 1 1
9 8 6 4 3 2