首页 > 代码库 > 2017/02/26学习笔记

2017/02/26学习笔记

堆 栈和内存映射

每个线程都有自己的专属栈,先进后出
栈的最多尺寸固定,超出则引起栈溢出
一个线程 一个栈,多个线程多个栈。
变量离开作用域范围后,栈上的数据会自动释放
堆上的内存必须手动释放,除非语言执行环境支持GC
怎么选择栈还是堆? 明确知道数据占用多少内存
数据很小
大量内存
不确定需要多少内存

int i=0;
scanf("%d",&i);
int array[i];//非法,定义数组的时候,必须是常量,而不能是变量

int *arr = malloc(sizeof(int)*i);//在堆当做动态创建一个int数组
free(arr);

 

code area:代码指令、常量字符串、只读
static area:存放全局变量、常量、静态变量、常量
Heap:有程序员控制,使用malloc/free来操作
stack:预先设定大小,自动分配与释放

栈的实现原理
栈顶从高到低向低地址方向增长
存储非静态局部变量、函数参数、返回地址

C语言的参数入栈,是从右往左

操作系统在管理内存的时候,最小单位不是字节,而是内存页。32位一般大小4KB。

calloc与malloc类似,负责在堆中分配内存
void *calloc(size_t _Count,size_t _Size);
第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(字节),calloc自动将分配的内存置0。
realloc重新分配用malloc或者calloc函数在堆中分配的内存空间的大小
void *realloc(void *p, size_t _NewSize);
在原有内存基础之上,在堆中间增加连续的内存。
如果原有内存没有连续的空间可扩展,那么会新分配一个空间,
将原有内存copy到新空间,然后释放原有内存.
realloc和malloc,一样只分配内存,不打扫。
第一个参数p为之前malloc或者calloc分配的内存地址,_NewSize为重新分配的内存的大小(字节)。
成功返回新分配的内存地址,失败返回NULL
如果参数p等于NULL,那么realoc与malloc功能一致。
如果是通过一个函数的参数给实参分配堆空间内存,那么一定是使用二级指针的方式。

2017/02/26学习笔记