首页 新闻 会员 周边 捐助

关于数据在内存中的储存

0
悬赏园豆:5 [已解决问题] 解决于 2018-04-22 19:15

#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个字节, 有什么规律?

Andromeda_Galaxy的主页 Andromeda_Galaxy | 初学一级 | 园豆:197
提问于:2018-04-17 19:25
< >
分享
最佳答案
0

由于你定的变量属于局部变量,于是申请内存便存在规律了。局部变量是储存在栈中的,栈的申请内存也是按照内存地址逐步减少的。Int 占4字节,char 占1字节,double占8字节。所以编译器会按部就班一个一个分配内存,就像往数组里插入数字一样。

但是有时候,两个变量之间的字节查不是固定的后一个变量的长度。比如c 和b 之间差7个字节,然而c只占有4个字节(内存分配是从下往上的,地址是从下往上递增的。)中间空出来3个字节,同理d和c空出来4个字节,至于为什么会空出来字节应该是为了数据对齐用的,但是为什么空3个字节,4个字节,我也不知道。不同的编译器都有不同的在栈内存分配的方法,实际上c语言中没有明确规定变量之间的地址分配是否是连续的,是否需要空出字节(数组里是要求地址是连续的),我使用的编译器,double的首地址和float的首地址隔8字节,恰好不空任何字节。

收获园豆:5
Shendu.CC | 老鸟四级 |园豆:2138 | 2018-04-17 21:48

我问了下老师,好像使以最大字节数对齐,就像上面有double 就以8字节数对齐,如果没有double ,float为最大字节数,就以4字节对齐。也可以用#pragma pack(1)  按一个字节对齐,编译器就会使字节连续

用#pragma pack(2) 也可以2个字节对齐

Andromeda_Galaxy | 园豆:197 (初学一级) | 2018-04-26 19:06

@Andromeda_Galaxy: 搜嘎!一般都是按最大字节数对齐的

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-04-26 20:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册