我的C语言入门到精通之路 day07

2016/04/20 15:42
阅读数 1

动态分配

 

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增加的个数

 


 

 

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部