所谓程序就是由实现算法的语句来操纵存放在计算机的内存中的数据。程序设计就是对内存直接或间接地使用。
内存的划分:
栈区:存放程序的局部变量和形参,函数执行完就释放栈的空间,用户是无法干预变量的产生和消亡,千万不要返回指向栈内存的指针!
静态区:存放程序的全局变量和静态变量,不按栈原则管理,长命。但局部静态变量仍受“作用域”的制约
堆区:存放程序动态申请的数据,需要注意的是申请可能失败,所以经常要注意判断if(NULL==P),在程序运行时才动态分配内存
代码区:存放程序的代码和常量(经常容易忽略的是字符串常量,要注意某些个指向字符串常量的指针)
堆空间的使用:
核心的函数有:malloc( )、calloc( )申请堆内存free( )释放堆内存 (勿忘#include "stdlib.h")
(1)void* malloc(size_t size); typedef unsigned int size_t;
从堆内存中分配连续的大小为size字节的内存单元,这些单元没有类型。若有足够的内存,则返回指向分配的内存空间的首地址(void *类型), 否则返回NULL。
要注意需要使用(类型* )把返回值强制转换为特定类型
(2)void *calloc( size_t num, size_t size ); 第一个参数设定小块的个数,第二个参数设定每个小块的大小(以字节为单位)。
申请分配一大块内存,并将该块内存全部“清零”。若内存足够,返回一个指向新分配内存首地址的void*类型的指针,否则返回NULL。
(3)void free( void *memblock);
用来释放被malloc( )或calloc( )分配的内存空间。
注意:传入指向堆内存空间的首地址,释放的是整个块,而不是指向该块的指针类型的大小。在程序的执行过程中,函数体内的局部指针变量在函数结束时会自动消亡,但是它所指向的动态分配的内存却不会自动释放,需要free( )函数来完成该任务。
其他注意事项
数组或指针的下标越界
内存释放不代表指针消亡 ,指针消亡不代表内存释放 将指针置为NULL以及对内存的释放是非常需要注意的地方
不能只释放块的一部分空间free的参数是首地址,要释放则全部释放
野指针,就是指针所指的内存被释放后,指针没有被置为NULL
内存泄露(http://baike.baidu.com/view/714962.htm)
堆内存申请完要释放,指针要置为NULL。