C语言中的堆与malloc和free
堆与 malloc和free
既然,除了全局区和栈区,其余的去全部为堆区,那么就可以知道,在程序运行过后,堆区的的空间分配是
非常大的。
而堆区的空间是需要动态申请和释放的,我们可以通过C语言标准函数中的malloc和free。来动态申请以及释放堆中的空间。
###malloc函数
函数原型如下:
void *malloc( unsigned int size );
在库函数<stdlib.h>中,使用前请包含<stdlib.h>
malloc接受一个参数,size意味着想要申请的空间的大小。malloc函数会返回一个无解释方式的指针即void *()
,指向刚刚申请到的空间的首地址。
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int* pValue = NULL;
pValue = (int*)malloc(4);
*pValue = 0x1111111;
*(pValue + 1) = 0x22222222;
return 0;
}
如果赋值时显示的上下限不对称是,说明可能越界了。
malloc技巧
我们需要与sizeof配合使用以增强可读性,逻辑性
如:
pValue = (int*)malloc(4*sizeof(int));
特别注意
在使用malloc是一定要使用错误检查,因为在malloc申请空间失败时,会返回0地址
所以为了避免语法malloc失败而造成的风险,务必对返回值进行检查
如果不进行检查:
int* pValue = NULL;
pValue = (int*)malloc(1000000000000);
*pValue = 0x11111111;
该程序会不可控,因为所申请的堆空间过大,在内存不够时,堆空间会申请失败,这就导致pValue的地址为0地址,零地址无法被写入,所以会造成程序出现莫名的错误,导致程序崩溃
所以一定要做如下的检查:
int* pValue = NULL;
pValue = (int*)malloc(10000000000000000000);
if (pValue == NULL)
{
printf("申请失败\r\n");
return -1;
}
*pValue = 0x11111111;
}
以保证程序的安全性
面试题:铪烫屯出现的场景
free函数
函数原型
void free(void *memblock);
语法
free(地址)
将申请到的堆的首地址
传递给free,即可完成堆空间的释放。
因为释放后的空间,不应该使用,但是C语言中对于使用释放后的空间这种行为,没
有约束力。
所以,我们强烈推荐,应该按以下代码规范,释放资源:
if (pValue != NULL)
{
free(pValue);
pValue = NULL;
}
free空间后,VS的debug版本会格式化空间,并将内容置为eefe
调试以下代码发现
#include <stdlib.h>
int main(int argc, char* argv[])
{
int* pValue = NULL;
pValue = (int*)malloc(4);
if (pValue == NULL)
{
printf("申请失败\r\n");
return -1;
}
*pValue = 0x11111111;
if (pValue != NULL)
{
free(pValue);
pValue = NULL;
}
}
- 申请空间之后,未赋值之前
- 赋值之后,释放之前
- 释放之后
可以看到内存地址的内容被格式化了
上一篇: 求最大公共子串
下一篇: C语言编程:简单的a+b
推荐阅读
-
C语言中堆内存的开辟和释放与内存处理函数
-
C语言中break与continue的用法和区别详解
-
C语言中堆内存的开辟和释放与内存处理函数
-
内存空间———堆(堆内存,malloc,calloc,realloc,free,常见错误案例剖析,其他常见错误,堆与栈的空间返回)【C】(o)
-
【C语言】动态内存分配(malloc,realloc,calloc,free)的基本理解和区别
-
C语言的内存分配malloc()和free()
-
malloc函数详解之自己用C语言写出实现malloc()和free()功能的函数
-
C语言中break与continue的用法和区别详解
-
C语言中的堆与malloc和free