C语言中内存区分配
2013-08-28 11:31
176 查看
1 。 每次都会遇到这个问题,一直是看了又忘,忘了又看。本文主要简介一下c中的内存类型和布局问题。
2。内存的类型
(1)栈区(stack):由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈。
在函数参数和地址入栈情况中,一般是从左向右将变量入栈,最后函数的地址入栈。
(2)堆区(heap):由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。即由malloc或new来分配,free和delete释放。
(3)全局区(静态区):全局变量和静态变量的内存是存储放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,
程序员结束后由系统释放。
(4)文字常量区:常量字符串放在这里。程序结束时系统释放。
(5)程序代码区:存放函数体的二进制代码。
下面是一段程序代码,具体说明:
int a = 0; //存放在全局初始化区
char *p1; //存放在全局未初始化区
int main()
{
int b; //存放于堆栈中,即栈中。
char s[] = "abc"; //存放于堆栈中, 即栈中。
char *p2; //存放于堆栈中,即栈中。
char *p3 = "123456"; //p3本身是存放在堆栈中,"123456"是存放在常量区中
static int c = 0; //存放在全局初始化区
p1 = (char*)malloc(10); //存放在堆中,由程序员手动释放。
p2 = (char*)malloc(20); //存放在堆中
strcpy(p1, "123456");
//"123456"在常量区。编译器可能会将它与p3所指向的"123456"优化成一个地方。
free(p1);
free(p2);
}
3 内存空间分配
对一个进程的内存空间分配,主要是代码区,静态数据区和动态数据区。c语言中有全局变量,本地变量,静态变量和寄存器变量。
静态数据区包括了全局变量和静态变量。动态数据区包括了堆,栈(堆栈)数据内容,编译的二进制代码就放在代码区。
├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域
3. 内存泄露问题
vc6.0里面的一种简单的检测内存泄露的方法。首先包含了下面的头文件
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。
然后在需要检测内存泄露的地方加入_CrtDumpMemoryLeaks();语句即可。
调试时使用Debug模式来调用,即会在输出信息的窗口出现相关内存信息。
2。内存的类型
(1)栈区(stack):由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈。
在函数参数和地址入栈情况中,一般是从左向右将变量入栈,最后函数的地址入栈。
(2)堆区(heap):由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。即由malloc或new来分配,free和delete释放。
(3)全局区(静态区):全局变量和静态变量的内存是存储放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,
程序员结束后由系统释放。
(4)文字常量区:常量字符串放在这里。程序结束时系统释放。
(5)程序代码区:存放函数体的二进制代码。
下面是一段程序代码,具体说明:
int a = 0; //存放在全局初始化区
char *p1; //存放在全局未初始化区
int main()
{
int b; //存放于堆栈中,即栈中。
char s[] = "abc"; //存放于堆栈中, 即栈中。
char *p2; //存放于堆栈中,即栈中。
char *p3 = "123456"; //p3本身是存放在堆栈中,"123456"是存放在常量区中
static int c = 0; //存放在全局初始化区
p1 = (char*)malloc(10); //存放在堆中,由程序员手动释放。
p2 = (char*)malloc(20); //存放在堆中
strcpy(p1, "123456");
//"123456"在常量区。编译器可能会将它与p3所指向的"123456"优化成一个地方。
free(p1);
free(p2);
}
3 内存空间分配
对一个进程的内存空间分配,主要是代码区,静态数据区和动态数据区。c语言中有全局变量,本地变量,静态变量和寄存器变量。
静态数据区包括了全局变量和静态变量。动态数据区包括了堆,栈(堆栈)数据内容,编译的二进制代码就放在代码区。
├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │
├———————┤
│ …… │
├———————┤
│ 代码区 │
├———————┤
│ 静态数据区 │
├———————┤
│ …… │
├———————┤高端内存区域
3. 内存泄露问题
vc6.0里面的一种简单的检测内存泄露的方法。首先包含了下面的头文件
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。
然后在需要检测内存泄露的地方加入_CrtDumpMemoryLeaks();语句即可。
调试时使用Debug模式来调用,即会在输出信息的窗口出现相关内存信息。
相关文章推荐
- c语言—指针基础(7:静态分配内存)
- c语言的函数内存分配及指针函数的用法
- C语言中内存分配
- 队列---C语言实现---三种内存分配方式
- C语言calloc()函数:分配内存空间并初始化
- C语言中内存分配方式
- c语言数组变量在内存中的连续分配情况
- C语言中的内存分配实例详解
- C语言之内存分配与释放:malloc, calloc, realloc & free
- C语言的那些小秘密之内存分配
- 读朱兆祺攻破C语言之八---内存分配与内存释放
- C语言-内存分配
- C语言——内存分配的方式
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C语言 内存分配 地址 指针 数组 参数 实例解析 (C语言复习)
- C语言中的内存分配深入
- C语言三个内存分配函数比较,malloc calloc realloc
- c语言 变量的存储类别以及对应的内存分配?
- C语言中内存分配
- C语言之内存分配例题详解