#include<bits/stdc++.h>
using namespace std;
int main()
{
int a=10;
char b='c';
float c=10.0;
double d=20.000;
int *a1=&a;
char *b1=&b;
float *c1=&c;
double *d1=&d;
printf("%d %x\n",a1,a1);
printf("%d %x\n",b1,b1);
printf("%d %x\n",c1,c1);
printf("%d %x\n",d1,d1);
cout<<endl;
printf("%d %x\n",&a1,&a1);
printf("%d %x\n",&b1,&b1);
printf("%d %x\n",&c1,&c1);
printf("%d %x\n",&d1,&d1);
}
输出
6946556 69fefc
6946555 69fefb
6946548 69fef4
6946536 69fee8
6946532 69fee4
6946528 69fee0
6946524 69fedc
6946520 69fed8
为什么double的首地址 和float的首地址隔了12个字节, 有什么规律?
由于你定的变量属于局部变量,于是申请内存便存在规律了。局部变量是储存在栈中的,栈的申请内存也是按照内存地址逐步减少的。Int 占4字节,char 占1字节,double占8字节。所以编译器会按部就班一个一个分配内存,就像往数组里插入数字一样。
但是有时候,两个变量之间的字节查不是固定的后一个变量的长度。比如c 和b 之间差7个字节,然而c只占有4个字节(内存分配是从下往上的,地址是从下往上递增的。)中间空出来3个字节,同理d和c空出来4个字节,至于为什么会空出来字节应该是为了数据对齐用的,但是为什么空3个字节,4个字节,我也不知道。不同的编译器都有不同的在栈内存分配的方法,实际上c语言中没有明确规定变量之间的地址分配是否是连续的,是否需要空出字节(数组里是要求地址是连续的),我使用的编译器,double的首地址和float的首地址隔8字节,恰好不空任何字节。
我问了下老师,好像使以最大字节数对齐,就像上面有double 就以8字节数对齐,如果没有double ,float为最大字节数,就以4字节对齐。也可以用#pragma pack(1) 按一个字节对齐,编译器就会使字节连续
用#pragma pack(2) 也可以2个字节对齐
@Andromeda_Galaxy: 搜嘎!一般都是按最大字节数对齐的