栈区——局部变量,函数形参
堆区——动态内存分配的空间 malloc ,realloc,calloc,free
静态区——全局变量,静态变量
malloc
void *malloc( size_t size );
size代表所要开辟空间的字节
1 如果开辟成功,返回指向开辟好的指针
2 如果开辟失败,则指向空指针,NULL
3 返回类型为void*,malloc函数并不知道开辟空间的类型,具体类型由使用者自己决定
4 malloc函数开辟空间不会初始化,空间内为随机值
以开辟空间用于建立数组为例
#include<stdio.h>
#include<stdlib.h>//或<malloc.h>
int main()
{
int*p=(int*)malloc(40);
if(p==NULL)
printf("开辟失败");
else
{
int i=0;
for(i=0;i<10;i++)
*(p+i)=i;
for(i=0;i<10;i++)
printf("%d ",p[i]);
}
free(p);
p=NULL;
}
free
c语言提供了free函数,专门用来做动态内存的释放和回收的
void free( void *memblock );
1 free指向的为空间不是动态开辟的或者指向空指针,则毫无意义
2 当使用完动态空间时,使用free函数释放,并且开辟的指针指向空指针NULL
3 释放时该指针必须为初始指针,不能变换(++或–),如果需要变换,可以另外赋值到一个新指针
4 忘记释放会发生内存泄露的问题,所要一定要释放
calloc
calloc 函数开辟的空间会初始化为0
void *calloc( size_t num, size_t size );
第一个参数为开辟的元素的大小,第二个参数为每个元素的字节大小,calloc函数开辟的空间会初始化为0
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p=(int *)calloc(10,sizeof(int));
if(p==NULL)
printf("开辟失败");
else
{
int i=0;
for(i=0;i<10;i++)
printf("%d ",p[i]);
}
free(p);
p=NULL;
}
打印结果为10个0,即已经初始化
realloc
当空间不足时,可用realloc函数在其后开辟新的空间
void *realloc( void *memblock, size_t size );
size为开辟空间的字节大小
#include<stdio.h>
#include<stdlib.h>
int main()
{ int i=0;
int *p=(int *)calloc(10,sizeof(int));
if(p==NULL)
printf("开辟失败");
else
{
for(i=0;i<10;i++)
printf("%d ",p[i]);
}
printf("\n");
int *ptr=(int *)realloc(p,80);
if(ptr==NULL)
{
printf("开辟失败");
return -1;
}
else
{ p=ptr;
}
for(i=0;i<20;i++)
printf("%d ",p[i]);
free(p);
p=NULL;
}
开辟空间有两种方式,当原本地址其后空间足够时,可直接开辟空间,返回原首地址,
当空间不足时,会令选取一部分空间开辟地址,然后将原先的数据复制下来,将原先的空间释放,返回新开辟地址的首元素