对于全局变量对应的内存分配问题的追踪
2017-04-07 12:45
302 查看
参考:
<如何实现一个malloc>
http://blog.codinglabs.org/articles/a-malloc-tutorial.html
测试代码:
由于测试用例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范围内,越界才出现段错误;
<如何实现一个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范围内,越界才出现段错误;
相关文章推荐
- c++ 全局变量的内存分配问题
- 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题
- 全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题
- 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题
- 类地内存分配问题及static变量问题
- 调试技巧(字符串化运算符#)& 变量内存分配问题
- 内存分配:堆、栈、全局变量/静态变量、代码区
- heap stack 堆栈 全局变量 静态变量 进程空间 内存分配
- C语言中的全局变量内存分配和初始化顺序
- 数据结构 学习笔记之:结构体及其所定义变量的内存分配的问题
- PHP变量内存分配问题记录整理
- C语言中的全局变量内存分配和初始化顺序
- 关于进程和线程对于全局变量共享的问题学习总结
- 关于全局变量内存分配的顺序
- C++类对象成员变量与成员函数内存分配问题
- 内存分配方式(动态/静态)的不同对const变量(全局/局部)访问性的影响
- 程序在的内存中的分配(常量,局部变量,全局变量,程序代码)(转)
- C++类对象成员变量与成员函数内存分配问题
- 程序在的内存中的分配(常量,局部变量,全局变量,程序代码)
- c++中变量的内存分配问题