目录
malloc的基本使用
malloc的函数原型是:
void *malloc( size_t size );
- size:表示要申请的堆空间的大小,单位字节
- 返回值是一个void*类型的指针,malloc会将分配得到的空间的内存首地址返回
之所以采用void*类型指针,是因为malloc无法提前知道我们申请的空间用于怎样的类型。因此,通常我们需要将返回值进行指针强转。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申请4字节的空间,作为存储int变量使用
//申请得到的空间首地址,赋值给pValue指针
int* pValue = (int*)malloc(4);
//修改值
*pValue = 0x11111111;
return 0;
}
我们也可以同时申请大于一个元素的空间地址:
int main(int argc, char* argv[])
{
//申请12字节的空间,作为存储3个int变量使用
//申请得到的空间首地址,赋值给pValue指针
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
return 0;
}
free的基本使用
free的函数原型为:
void free( void *memblock );
可以看到,free没有返回值,只有一个参数,我们将之前申请的堆内存首地址传递给free即可。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申请12字节的空间,作为存储3个int变量使用
//申请得到的空间首地址,赋值给pValue指针
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
free(pValue);
return 0;
}
但是要注意,若传递给free的地址,并不是之前申请过的堆内存地址,则会出现错误。
malloc配合sizeof使用
在实践中,malloc一般配合sizeof使用,增加代码的可读性。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申请12字节的空间,作为存储3个int变量使用
//申请得到的空间首地址,赋值给pValue指针
int* pValue = (int*)malloc(sizeof(int)*3);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
return 0;
}
内存泄漏问题
如果对于堆内存,只申请不释放,就会造成资源的泄漏。
某些情况,因为代码的不规范,会导致无法释放资源:
void MyFun()
{
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue + 1) = 0x22222222;
*(pValue + 2) = 0x33333333;
}
int main(int argc, char* argv[])
{
MyFun();
return 0;
}