前言:C/C++中动态内存开辟的方法和函数有许多,我们这里主要讲解malloc,calloc,realloc。
细节和注意事项在最后小结
一,mallloc
函数参数:
void* malloc (size_t size)
malloc函数的参数是无符号整形,表示你要开辟内存空间的字节大小,返回值:如果开辟空间成功的首地址,开辟内存失败则会返回NULL指针,返回类型是void *,因此在接收时要进行强制转化,不然编译器可能报错。
例如:申请四十个空间的内存
int* ptr=(int *)malloc(40);
函数原理:它会在堆上找一块空间,空间大小会大于你输入的字节,方便释放和操作。
二,calloc
函数参数:
void* calloc (size_t num, size_t size);
相较于malloc,calloc参数不同,它有两个参数,第一个参数是你要申请空间的数量大小,第二个参数是申请空间的每个单位的大小,返回值:如果开辟空间成功的首地址,开辟内存失败则会返回NULL指针。例如:申请十个int 类型的空间应该这样写:
int* temp=(int*)calloc(10,sizeof(int));//sizeof(int)可以改为4
函数原理:
参考malloc原理。
三,realloc
函数参数:
void* realloc (void* ptr, size_t size);
realloc函数用来修改已经开辟好的空间大小,参数有两个,第一个参数是原来开辟空间的地址,第二个参数是新开辟空间的字节大小,返回值:如果开辟空间成功的首地址,开辟内存失败则会返回NULL指针。
例如:修改malloc开辟的40个空间为50个字节
int* ptr=(int *)malloc(40); int *ptr2=(int *)realloc(ptr,50);
函数原理:
与前面两个函数不同,realloc函数要做的事更多,函数更加复杂。它也会开辟大于字节的空间,但是它还要原来开辟空间里面的内容复制到新开辟的空间里面,然后释放原空间的内存。
五,小结
malloc,calloc是用来在堆开辟空间的函数,realloc是修改已经开辟空间的内存。
使用完空间后要用free进行释放
free(ptr);
易见错误:
1)对NULL指针的解引用操作
因此每次开辟空间都有判断是否为NULL指针
2)对开辟空间的越界访问
3)对非动态内存开辟空间free
4)只释放开辟内存的一部分
因此尽量不要移动首地址,就算要移动也要记录地址,放在只释放一部分地址