对于全局变量对应的内存分配问题的追踪

参考:
<如何实现一个malloc>
http://blog.codinglabs.org/articles/a-malloc-tutorial.html


测试代码:
int nNum1;//Save into DATA
int nNum2;//Save into DATA
int nNum3;//Save into DATA
int nNum4=1111111;//Save into BSS
int nNum44=22222;
int nNum45=3333;
int nNum5;//save into BSS
void test1()
{
        printf("Num1:%p %d\n",&nNum1,nNum1);//Num1:0x602070 0
        printf("Num2:%p %d\n",&nNum2,nNum2);//Num2:0x602074 0
        printf("Num3:%p %d\n",&nNum3,nNum3);//Num3:0x602078 0
        printf("Num4:%p %d\n",&nNum4,nNum4);//Num4:0x602060 1111111
        printf("Num44:%p %d\n",&nNum44,nNum44);//Num44:0x602064 22222
        printf("Num45:%p %d\n",&nNum45,nNum45);//Num45:0x602068 3333
        printf("Num5:%p %d\n",&nNum5,nNum5);//Num5:0x60207c 0

        int* p = &nNum3;
        *p=33;
         printf("Num3:%p %d\n",&nNum3,nNum3);//Num3:0x602078 33
        *(p+1)=44;
        printf("Num4:%p > %p %d\n",p+1,&nNum4,nNum4);//Num4:0x60207c > 0x602060 1111111
        *(p+2)=55;
        printf("Num5:%p > %p  %d\n",p+2,&nNum5,nNum5);//Num5:0x602080 > 0x60207c  44
        *(p+3)=66;

        p=&nNum1;
        for(int i=0;i<100000;++i)
        { 
          *(p+i)=i;
          printf("%d %p\n",i,p+i);
        }
}

由于测试用例test1,推断的结论:
关于全局变量:
1.按照<如何实现一个malloc>描述:全局变量存储在DATA和BSS两个区间
2.全局变量的地址分配顺序是从低地址到高地址
3.已初始化过的全局变量存储在DATA区域,未初始化的全局变量存储在BSS区域;
4.编译器先初始化DATA区域,再初始化BSS区域(全局变量被自动清零了),测试发现第一个未初始化的全局变量地址
 大于最后一个已经初始化的全局变量的地址为8个字节;
5.从第一个全局变量指定的地址0x602070(假设从这里开始),发现通过偏移然后写的方式,一直到偏移3980字节到了0x602ffc之后
  发生段错误,这是否说明全局变量的存储空间是有限的,

   
  然后我又用了如下代码做测试:
#include <stdlib.h>
#include <stdio.h>
char buf;
int main()
{
        char* p = &buf;
        printf("%p\n",p);
        for (int i=0;i<10000;i++){
                *(p+i)=0;
                printf("%d %p > %p \n",i,p,p+i);
        }
        return 0;
}        


最后一行的结果是:4038 0x601039 > 0x601fff <崩溃在这一行>


#include <stdlib.h>
#include <stdio.h>
char buf[4096];
int main()
{
char* p = buf;
printf("%p\n",p);
for (int i=0;i<10000;i++){
*(p+i)=0;
printf("%d %p > %p \n",i,p,p+i);
}
return 0;
}
最后一行的结果是:8095 0x601060 > 0x602fff <崩溃在这一行>


  这给了我一个关于全局变量的猜想,是不是给予全局变量做分配的时候,首先按照程序的要求的所有的全局变量的大小,分配足够的内存页进行管理;你看,如果全局变量的总的size小于4096,就分配了一个PAGE,
  于是实际上可以访问4096字节以内的内存空间,如果全局变量的总的size大于4096*1,就分配2个PAGE,于是实际上可以访问的空间是4096*2范围内,越界才出现段错误;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值