一、系统内存分区
C语言程序编译环境下的系统内存有5个分区,每个分别有不同的使用者:
1、栈区(Stack):编译系统自动分配释放,主要存放函数参数、局部变量等。
2、堆区(Heap):由程序员来进行分配释放管理,一般由malloc,new等内部存储函数使用,如果没有收回,程序结束时会由操作系统收回。创建堆时,一般在堆的头部(head)用一个字节存放堆的大小;回收堆时,通过查看这个字节(head)中的内容,可得知需要释放多大的内存。(如链表就是用堆区)
3、全局区(或静态区):存放全局变量和静态变量,程序结束时由系统释放,分为全局初始化区和全局未初始化区。
4、常量区:存放常量,程序结束时由系统释放。
5、程序代码区(上面4个区统称为数据区):存放运行或准备运行的程序代码,由系统调度。
要是用malloc函数和free函数等要是用#include <malloc.h>或#include <stdlib.h> 。
二、malloc函数
表达为:void * malloc(unsigned int size(准备分配的存储空间的大小));(返回类型是一个通用指针)
功能:分配一块长度为size字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功地执行,返回值为空指针(NULL)。由于返回的指针的基类型是void,应该通过类型转换后才能存入其他基类型的指针变量。
如:
int *p;
p=(int*)malloc(sizeof(int));
三、free函数
表达为:void free(void * block);
功能:释放以前分配给指针变量block的动态空间,但指针变量block不会自动变成空指针。一般在使用malloc语句后必须使用free语句去释放你所分配的内存,否则内存会一直存储而不会释放,造成垃圾内存。
如:
int *p, i=0;
if((p=(int*)malloc(10*sizeof(int)))!=NULL)
{
for(i=0;i<10;i++)
p[i]=i*i;
free(p);
}
注:上面的if语句是严谨的,如果你要分配的内存空间巨大,系统可能没有这么大的存储空间分配给你,所以可能分配失败,所以这个if语句就可以防止分配不成功的情况。
我们就上面的p=(int*)malloc(10* sizeof(int))分析一下。10* sizeof(int)=40,所以一共分配了40个字节,而程序是以int整数类型去看待这40个字节的,也就是说分成了10个int整数的空间。
四、memset函数将存储空间初始化
表达为 void memset(指针变量,初始化值,空间大小);
如:
int *ip;
ip=(int *)malloc(10*sizeof(int));
memset(ip,0,10*sizeof(int));//即将所分配的空间全部初始化为0
一般可用memset函数进行数组的初始化,非常便捷。