动态分配
1、 数组只能处理小数据
例如:定义数组 int a[1024*1024*10] ; 运行报错
2、动态分配,是指用户可以在程序运行期间根据需要申请或释放内存,大小也完全可控。动态分配不像数组内存那样需要预先分配空间,而是由系统根据程序需要动态分配,大小完全按照用户的要求来,当使用完毕后,用户还可释放所申请的动态内存,由系统回收,以备他用。
malloc和free是C标准库中提供的两个函数,用以动态申请和释放内存
n malloc()函数的基本调用格式为:
n void *malloc( unsigned int size );
n 参数size是个无符号整型数,用户由此控制申请内存的大小,执行成功时,系统会为程序开辟一块大小为size个内存字节的区域,并将该区域的首地址返回,用户可利用该地址管理并使用该块内存,如果申请失败(比如内存大小不够用),返回空指针NULL。
在栈区开辟一段内存,系统会自己回收。
在堆区开辟一段内存,需要自己手动用free释放内存
开辟内存后立即释放掉
free就是释放内存,例如free(p)
malloc()函数返回类型是void*,用其返回值对其他类型指针赋值时,必须进行显式转换。
free函数注意事项
1、malloc函数和free函数 在stdlib.h头文件里面
2、蚕食法消耗内存
while(1)
{
//malloc分配内存,单位为字节,返回值是这一片内存的地址,类型为void空指针
void *p=malloc(1024*1024*100);
Sleep(1000); //休眠1秒
free(p); //释放内存
//free(p); //释放内存,只能释放一次
Sleep(1000);
}
malloc_calloc_realloc
1、C语言标准库函数还提供了calloc函数用以动态申请内存,和malloc函数以字节为单位申请内存不同,calloc函数是以目标对象为单位分配的,目标对象可以是数组,也可以是后面会讲到的结构体等。
n calloc函数的原型为:
n void* calloc(size_t num, size_t size);
n malloc()函数返回类型也是void*,需要强制转换才能为其他类型的指针赋值。calloc需要两个参数以指定申请内存块的大小,一是对象占据的内存字节数size,二是对象的个数num。
n size_t类型是无符号整型,在Windows及LCC编译环境下,其定义为:
n typedef unsigned int size_t;
n 为已经分配的内存重新分配空间并复制内容
n realloc()函数有两个参数
n 已分配的内存地址
n 重新分配的字节数
void *realloc( void *ptr, size_t size );
2、 calloc会自动将内存初始化为0,malloc就不会
int num;
scanf("%d",&num);
(1)malloc函数
//动态数组,输入19,就有19个元素,初始化
int *p=(int *)malloc(sizeof(int)*num);
如果指针p==NULL则内存分配失败,否则就分配成功
(2)calloc
int *p=(int *)calloc(num,sizeof(int)); //动态分配
//第一个参数,多少个, 第二个参数元素占多大
如果指针p==NULL则内存分配失败,否则就分配成功
(3)relloc
relloc 如果可以拓展就拓展,否则就重新分配
拓展就是在原来地址后面增加内存。
不够的情况下,就回收原来的内存,并在回收之前分配一片内存,将原来的内容拷贝过来。然后收回原来的内存。
addnum增加的个数