内存
来源:互联网 发布:追梦美工学院 编辑:程序博客网 时间:2024/05/02 02:48
一个由 c/C++ 编译的程序占用的内存分为以下几个部分 、
1、栈区( stack stack stack stack )
由编译器自动分配释放,存放函数的参数值,局部变量的值等。 、
2、堆区( heap heap heap heap )
一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。 、
3、全局区(静态区) ( static static static static )
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变
量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。 、
4、文字常量区
常量字符串就是放在这里的。 程序结束后由系统释放。 、
5、程序代码区
存放函数体的二进制代码。
ep:main()
{
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; //123456\0 在常量区, p3 在栈上。
static int c =0 ; // 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来得 10 和 20 字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0 放在常量区,编译器可能会将它与 p3 所指向的 "123456" 优化成一个地方。
}
6、全局变量和静态变量的地址分配是连在一起分配的,也就是说他们的地址是连续的
int g1=0, g2=0, g3=0;
void main( )
{
static int s1=0, s2=0, s3=0;
int v1=0, v2=0, v3=0;
// 打印出各个变量的内存地址
printf("0x%08x\n",&v1); // 打印各局部变量的内存地址
printf("0x%08x\n",&v2);
printf("0x%08x\n\n",&v3);
printf("0x%08x\n",&g1); // 打印各全局变量的内存地址
printf("0x%08x\n",&g2);
printf("0x%08x\n\n",&g3);
printf("0x%08x\n",&s1); // 打印各静态变量的内存地址
printf("0x%08x\n",&s2);
printf("0x%08x\n\n",&s3);
}
输出的结果是:0x0012ff7c
0x0012ff78
0x0012ff74
0x00425798
0x0042579c
0x004257a0
0x004257a4
0x004257a8
0x004257ac
由结果可以看出,v1、v2、v3和其他六个变量的内存地址没有一点联系,而g1、g2、g3、s1、s2、s3的地址是连续的,因为g是全局变量,而s是静态变量。
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- 内存
- [Iphone开发小记] UIColor 的RGBA定义颜色 (colorWithRed)
- Android 学习笔记 Service (二) Remote Service Sample
- linux 内核是使用c语言写的
- kvm的快照功能 (一、基于qcow2文件的快照)
- Diary in 20121114
- 内存
- winform C#屏幕右下角弹出消息框,自动消失
- 如何根据搜索引擎的工作原理来做优化?
- 结构体,共用体
- VC++基于LSP实现数据拦截
- 数据结构4
- android GC_CONCURRENT and GC_EXTERNAL_ALLOC
- 链表
- 文件