传送门《高质量C编程教程汇总》
1.程序设计本质
- 所谓程序就是由实现算法的语句来操纵存放在计算机的内存中的数据.
- 程序设计就是对内存直接或间接地使用.
- 内存的分配和活动是编程者的第一要务
2.内存划分(4个区域)
(1)代码区:
存放程序所有执行代码和常量,只读不可写.
(2)栈区(stack)
存放程序的局部变量和形参
①系统按栈原则管理:
进栈退栈-先进后出
②函数执行完则释放
③用户无法干预变量的诞生和消亡
(3)堆区(heap)
①长命
②无名
③用户干预变量的诞生和消亡
④在程序运行时动态分配内存
⑤申请可能失败(编程时需要判断)
if (Null == p)
{
printf("Memory create Fail!\n");
return 1;
}
(4)静态区(static)
存放程序的全局变量和静态变量
①不按栈原理管理
②长命
③生命周期:全程序
④不初始化时默认为0
3.堆空间的使用
(1)C中动态分配内存的函数
//申请堆内存
malloc();
calloc();
//释放内存
free();
使用这3个函数必须包含头文件stdlib.h
(2)malloc()
函数原型 | void * malloc(unsigned size); |
---|---|
功能 | 从堆内存中分配连续大小为size字节的内存单元,这些单元没有类型 |
返回值 | 若是有足够内存,返回指向分配内存空间的首地址,否则返回NULL |
(3)calloc()
函数原型 | void * calloc(unsigned n,unsigned size); |
---|---|
功能 | 分配n个size大小的内存连续空间,并将该块内存全部清零 |
返回值 | 若内存足够,返回新分配内存首地址,否则返回NULL |
(4)free()
函数原型 | void free(void *p); |
---|---|
功能 | 用来释放被malloc()或calloc()分配的内存空间 |
返回值 | 无 |
注意:
- 传入指向堆内存空间的首地址,释放的是整个块,而不是指向该块的指针类型的大小.
- 释放完后一般使
p=NULL;
(5)使用堆空间的注意事项
①申请不一定成功,使用前判断
②用完后空间要释放,只能释放申请时的初地址p(前4个字节存放开辟内存长度等信息)
③指针要置NULL
交还malloc申请空间的使用权给系统