您的位置:首页 > 其它

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

2017-04-07 12:45 302 查看
参考:

<如何实现一个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范围内,越界才出现段错误;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: