动态内存分配

来源:互联网 发布:淘宝透明拉链袋 编辑:程序博客网 时间:2024/05/17 02:09

动态内存分配

1.      malloc和free

这两个函数的原型如下

void *malloc(size_t size);

void free(void *pointer)

这两个函数都存在stdlib.h中,用于冬天内存开辟

注意:每次使用malloc动态开辟内存的时候,都要用一个指针接受他的返回值

如果malloc开辟内存失败了,就会返回一个NULL,所以每次检查是否开辟成功是很有必要的,使用if(.. == NULL){……exit(1);},另外malloc参数中的size是字节大小,通常结合着sizeof关键字进行使用。下面的例子很好的说明了sizeof的好处,请看程序

int *pi;

pi = malloc(100);

if(NULL == pi)

{

  printf(“out ofmemory!”);

  exit(1);

}

这里是开辟了100个字节,总共是25个整型,因为pi的类型是指向整型的指针,但是这里如果我们使用sizeof会更加的清新

pi = (int *)malloc(25 * sizeof(int));

 

使用free函数时,参数必须是malloc,realloc和calloc返回的指针,如果不是指向动态开辟内存空间的指针,程序就会终止,或者晚些时候终止。

2.      calloc和realloc

函数原型如下

void *calloc(size_t num_elements,size_t element_size)

void realloc(void *ptr,size_t new_size)

 

calloc在使用的时候,和malloc的一个区别在于,calloc在返回指向内存的指针之前把它初始化为0.

 

注意:这里在使用realloc的时候,也使用一个指针变量接收他的返回值,防止realloc在使用的时候,内存空间开辟不足,这样就不是在原先的地址后面开辟的了,所以要用一个指针重新指向这块内存空间。

使用realloc可以改变一块内存空间的大小,如果用于扩大内存空间,那么这块内存的原先的内容被保留,新增加的内存在原先内存的后面,并且新增加的内存并没有进行初始化。如果是缩小内存,那么尾部的内存后被拿掉,剩余部分的内存内容被保留了。如果原先的内存大小无法改变,realloc将重新开辟一个空间,并且把之前放在里面的内容复制到新的空间里面去,因此在使用realloc之后,你就不能在使用指向旧的内存的指针了,而是应该指向realloc返回的一个新的指针。

 

 

1 0