c语言问题 刷题网站看的,答案是-5,经实测答案没问题。百思不得其解,望大佬解答。
#include<stdio.h>intmain(){inta[4];intb[4];printf("%d\n",&b[3]-&a[2]);return0;}...
#include <stdio.h>
int main() {
int a[4];
int b[4];
printf("%d\n", &b[3] - &a[2]);
return 0;
} 展开
int main() {
int a[4];
int b[4];
printf("%d\n", &b[3] - &a[2]);
return 0;
} 展开
1个回答
展开全部
实际在gcc下测试, 输出结果为5.
从理论上来说, 不应该也不可能出现-5的情况.
局部变量是分配在栈空间上的.
在函数内部连续的局部变量, 如果在没有出现对齐的情况下, 即两个变量中间没有未用字节时, 地址是连续的.
也就是说 a和b的地址应该是连续的(但实际上因编译器不同而有可能不连续.)
那么就有先分配a还是先分配b的区别, 这一点同样是编译器决定的.
如果先分配a 那么b=a+4 这时&b[3] - &a[2]=5 也就是gcc上的结果.
如果先分配b, 那么a=b+4 ,这时&b[3] - &a[2]=-3
无论如何 不应该出现-5的结果.
从理论上来说, 不应该也不可能出现-5的情况.
局部变量是分配在栈空间上的.
在函数内部连续的局部变量, 如果在没有出现对齐的情况下, 即两个变量中间没有未用字节时, 地址是连续的.
也就是说 a和b的地址应该是连续的(但实际上因编译器不同而有可能不连续.)
那么就有先分配a还是先分配b的区别, 这一点同样是编译器决定的.
如果先分配a 那么b=a+4 这时&b[3] - &a[2]=5 也就是gcc上的结果.
如果先分配b, 那么a=b+4 ,这时&b[3] - &a[2]=-3
无论如何 不应该出现-5的结果.
更多追问追答
追问
你说的很有道理,我换了别的编译器,发现有-3和5的,就是你说的先分配哪个的问题。但是,我一开始是在vs2017上得到的-5,打印地址之后发现编译器先分配b再分配a,中间还莫名其妙地留下八个字节!?为什么这种情况都会对齐?
追答
无法理解,vs有些想法是理解不了的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询