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 }