1.内存分配函数_alloca、malloc、realloc、calloc:
_alloca
函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h
_alloca函数返回一个指向申请到的空间的void型指针。该函数向栈(stack)申请内存,用完就立刻释放,无需手动释放。
malloc 动态内存分配
函数原型 extern void *malloc(unsigned int num_bytes);
函数声明void *malloc(size_t size); 头文件stdlib.h malloc.h
malloc函数返回一个指向申请到的空间的void型指针,若申请失败则返回NULL。该函数向堆(heap)申请内存,不再使用该空间时,需要用free()释放。否则会造成内存泄漏。
calloc 动态内存分配并清零
函数原型 void *calloc(size_t n, size_t size); 头文件 stdlib.h malloc.h
calloc 函数在内存的动态存储区中分配n个长度为size的连续空间,返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。同样需要用free()释放。
其中清零指:若是为字符类型或整型元素分配内存,这些元素会被初始化为0;若是为指针类型元素分配内存,其通常被初始化为空指针;若为实型数据分配内存,则被初始化为浮点型的零。
1 //calloc分配完存储空间后将元素初始化 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main() 5 { 6 int* p = (int*)calloc(10, sizeof(int)); 7 for(int i = 0; i < 10; i++) 8 printf("%d", p[i]); 9 printf(" "); 10 free(p); 11 return 0; 12 }
输出为十个0
realloc 动态内存调整(对malloc申请的内存进行大小的调整)
函数原型extern void *realloc(void *mem_address, unsigned int newsize); 头文件:stdlib.h 有些编译器需要malloc.h
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
对于缩小:被缩小的那一部分的内容会丢失
对于扩大:先判断当前的指针是否有足够的连续空间,如果有,直接从现存的数据后面向堆申请内存以扩大内存空间,即扩大mem_address指向的地址,并且将mem_address返回;如果空间不够,先按照newsize指定的大小分配其他空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
1 //Eg1 realloc有足够内存空间分配 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 char *p = (char *)malloc(10); 8 char *q = p; 9 p = (char *)realloc(p, 10); 10 printf("p=0x%x ", p); 11 printf("q=0x%x ", q); 12 13 return 0; 14 } 15 // 结果:p=0xb91398 16 // q=0xb91398 17 //验证:有足够内存空间分配 扩大p指向的空间,并将原来p返回。
1 //Eg2 realloc无足够内存空间分配 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 char *p = (char *)malloc(10); 8 char *q = p; 9 p = (char *)realloc(p,1000); 10 printf("p=0x%x ", p); 11 printf("q=0x%x ", q); 12 return 0; 13 } 14 // 结果:p=0x690c50 15 // q=0x691398 内存地址改变 16 //验证:无足够内存空间分配 按newsize分配空间 将数据拷贝到新内存区域 17 // 返回新分配的内存区域的首地址
2.malloc、realloc、calloc异同点
同:1.头文件stdlib.h malloc.h
2.函数的返回值都是新申请内存空间的首地址,失败则返回NULL
3.向堆(heap)申请内存,不再使用其申请空间时用free()释放
异:
malloc与calloc:calloc在动态分配完内存后,自动初始化该内存空间为零;而malloc不初始化,里面数据是随机的垃圾数据。
malloc与realloc:realloc是对malloc申请的内存进行大小的调整。缩小时,被缩小的那一部分的内容会丢失。扩大时,realloc会向堆中现存的数据后申请需扩大的内存,若成功,则返回地址与原首地址相同;若内存空间不够,则选取堆中足够大小的自由块,将原有数据依次拷贝到新地址,并释放原来所使用内存区域(系统自动释放),同时返回新分配的内存区域的首地址。