动态内存分配的函数
只有使用指针,才能动态内存分配
堆:在程序执行期间分配内存时的,内存区域的空间称为heap
堆栈:堆栈的空间分配给函数的参数和本地变量.stack
malloc()函数、calloc()函数、realloc()函数因某种原因失败,就返回NULL(空);否则为非NULL(非空);
#include <stdlib.h>
- 使用动态内存分配时,在程序开头的头文件中包含以上代码。
malloc()函数
- malloc(要分配的内存字节数)
- malloc()函数返回所分配的内存的第一个字节的地址。
因为返回的是一个地址,所以必须使用指针。
int *pNumber = (int*)malloc(100);
int *pNumber = (int*)malloc(25*sizeof(int));
int *pNumber = (int*)malloc(25*sizeof(int));
if(!pNumer)
{
printf("code to deal with memory allocation failure");
}
释放动态分配的内存
为什么会出现泄露呢?
当动态分配了一些内存的时候,没有保留对她们的引用,造成无法释放内存。
要释放动态分配的内存地址,必须能访问引用内存块的地址
free(pNumber)
pNumber = NULL;
calloc()函数
- calloc(数组的元素个数size_t,数组元素占用的字节数size_t)。
- calloc()函数所分配的内存区域的地址返回为void*类型。
int *pNumber =(int*)calloc(75,sizeof(int));
省略了类型转换,让编译器去执行 类型转换
int *pNumber = calloc(75,sizeof(int));
pPrimes = calloc(size_t)total,sizeof(unsigned long long)
if(primes == NULL)
{
printf("Not enough memory. It's the end I'm afraid.\n");
}
扩展动态分配的内存
Extending dynamically allocated memory
realloc()函数
- realloc(包含地址的指针,要分配的新内存的字节数)
- realloc()函数返回一个指向新内存的void*指针
- 新扩展的内存可以大于或小于原内存
- realloc()函数保存了原内存区域的内容,且保存的量是新旧内存区域中较小的哪一个。(既然是扩展内存为什么不扩展更大的反而选择小的内存呢?)
函数原型:void* realloc()
函数用法 : #include