动态开辟内存
malloc开辟内存
#include
void *malloc(size_t size)
- size :需要开辟的内存空间的大小,以字节为单位。
- 返回值 :返回一个指向开辟的内存空间的指针(void*类型,需要其他类型时使用强制类型转换即可)
- 如果请求失败,则返回 NULL。
void free(void *ptr)
- 函数作用:释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
- ptr:指针指向一个要释放内存的内存块。
- 一般在释放空间时,同时也会将该空间的指针赋值为NULL,避免它成为野指针。
- 如果不释放申请的内存空间,在程序结束时,会由操作系统自动回收。
- malloc 和 calloc 之间的不同点是:calloc 会将申请的空间初始化为0,而malloc 是随机值。
void *calloc(size_t nitems, size_t size)
- nitems :要被分配的元素个数。
- size :元素的大小。
- 如果请求失败,则返回 NULL。
void *realloc(void *ptr, size_t size)
- ptr :需要重新分配内存的内存块的指针。
- 该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。
- 如果为空指针,则会分配一个新的内存块。
- size : 内存块的新的大小,以字节为单位。
- 如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。
- 【动态内存管理】注意:
- 如果源内存后面的空间足够大,则realloc会在源空间后面追加分配内存。
- 如果源内存后面的空间不够大,则realloc会在其他空间分配内存,并且将原来空间的值依次拷贝过去,然后将原来的空间释放掉。
int main()
{
int* p = (int*)malloc(1000);
*p = 10;
//如果内存分配失败,malloc返回NULL,这里就会出错
return 0;
}
- 解决办法:进行NULL检测(判断malloc(1000)是否等于NULL)
int* p = (int*)malloc(1000);
for (int i = 0;
i<1000;
i++)
{
*(p + i) = i;
//这里当i超过250后,就会出现越界访问
}
对非动态开辟内存的释放
int a = 10;
int* p = &a;
free(p);
//a是局部变量,不能用free释放,由系统自动释放
p = NULL;
对动态开辟的空间只释放一部分
int* p = (int*)malloc(100);
for (int i = 0;
i < 50;
i++)
{
p++;
}
free(p);
//此时指针p已经指向开辟的空间中间部分了,只能释放指针之后的部分
p = NULL;
对同一块内存多次释放
int* p = (int*)malloc(100);
free(p);
p = NULL;
free(p);
//多次释放,程序会出错。
p = NULL;
推荐阅读
- 自定义类型(结构体等)
- 函数指针
- C++ 中的 Lambda 表达式
- C/C++|C++四种强制类型转换总结
- c/c++|c++四种强制类型转换
- C/C++|C++四种类型转换运算符详解
- c/c++|华东理工某ACMer总结
- C|C语言深度解剖篇——关键字&&补充内容
- C/C++详解如何实现文件备份