C语言 ---- realloc\malloc\calloc

realloc()

extern void *realloc(void *mem_address, unsigned int size);

指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

头文件: <stdlib.h>

更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况:

1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。

2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。当内存不再使用时,应使用free()函数将内存块释放。

 

malloc()

extern void *malloc(unsigned int size);

头文件:stdlib.h。

功能:分配长度为size字节的内存块

返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

说明:关于该函数的原型,在旧的版本中malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

 

calloc()

void *calloc(unsigned n,unsigned size);

头文件:stdlib.h

功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

跟malloc的区别:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据

calloc函数一次可以分配n块区域。

例如: ps=(struet stu*) calloc(2,sizeof (struct stu));

其中的sizeof(struct stu)是求stu的结构长度。

意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(void) {
 5     int n = 10;
 6     int i;
 7     long *mal = (long *)malloc(n * sizeof(long));
 8    long *cal=(long *)calloc(n,sizeof(long));
 9 
10    for (i = 0; i < n; i++)  
11    {
12     printf("%d\t", mal[i]);  
13    } 
14 
15    for (i = 0; i < n; i++)  
16      {   
17     printf("%d\t", cal[i]);
18      }
19 
20    printf("malloc内存地址: %p\n", mal);   
21     for (i = 0; i < n; i++)   mal[i] = i+1;    
22     for (i = 0; i < n; i++)   printf("%d\t", mal[i]); 
23    printf("\n\n");    
24 
25   n = 4;     
26   mal = (long *)realloc(mal, n*sizeof(long));   
27   printf("realloc内存地址: %p\n", mal);  
28   for (i = 0; i < n; i++)   printf("%d\t", mal[i]); 
29     printf("\n\n");     
30 
31   int num = 10;     
32   mal= (long *)realloc(mal, num*sizeof(long));   
33   printf("re-realloc内存地址: %p\n", mal);   
34   for (i = 0; i < n; i++)   printf("%d\t", mal[i]);
35 
36    free(mal);  
37   free(cal);  
38   getchar();    
39   return 0;
40 }

 

posted @ 2016-03-09 16:10  Jianhui_Ethan  阅读(361)  评论(0编辑  收藏  举报