🌏博客主页:PH_modest的博客主页
🚩当前专栏:C语言跬步积累
💌其他专栏:
🔴 每日一题
🟡 每日反刍
🟢 读书笔记
🌈座右铭:广积粮,缓称王!
一.malloc和free
1.malloc
void* malloc(size_t size);
这个函数向内存申请一块连续可用 的空间,并返回指向这块空间的指针。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。( 使用strerror(errno) 来获取错误信息 )
- 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。 (强制类型转换)
- 如果参数 size为0,malloc的行为是标准是未定义的,取决于编译器
- 申请空间的大小是以字节为单位
2.free
void free(void* ptr);
free函数用来释放动态开辟的内存。
- 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
- 如果参数 ptr 是NULL指针,则函数什么事都不做。
- free并不会主动将接收的地址置为空,释放之后需要主动将地址置为空(即
free(p); p = NULL;
3.应用
#include<stdio.h>
#include<string.h>//strerror的头文件
#include<stdlib.h>//malloc的头文件
#include<errno.h>//errno的头文件
int main()
{
//申请
int* p = (int*) malloc(20);
if(*p == NULL)//申请内存空间太大的话会返回空指针
{
printf("%s\n",strerror(errno));//反馈错误内容
return 1;
}
//使用
int i = 0;
for(i = 0; i < 5; i ++)
{
p[i] = i + 1;
//*(p + i) = i + 1;
}
for(i = 0; i < 5; i++)
{
printf("%d ",p[i]);
}
//释放
free(p);//释放p的内存
p=NULL;//将p的内存置为空
return 0;
}
二.calloc
void* calloc(size_t num, size_t size);
- 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
- 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
1.应用
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
int main()
{
//申请
int *arr = (int*)calloc(20, sizeof(int));
if (arr == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//使用
int i = 0;
for (i = 0; i < 5; i++)
{
*(arr + i) = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
//释放
free(arr);
arr = NULL;
return 0;
}
2.calloc和malloc之间的特点
- 参数不同
- 都是在堆区上申请内存空间,但malloc不会将内存空间初始化为0,calloc会初始化为0,如果需要初始化为0就用calloc
- 申请的内存是以字节为单位
三.realloc
1.知识点
void* realloc(void* ptr,size_t size);
- ptr是要调整的内存地址
- size 是调整之后新的大小
- 返回值为调整之后的内存起始位置
- 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
- realloc在调整内存空间的是存在两种情况:
①原有空间之后有足够大的空间:该情况要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化
②原有空间之后没有足够大的空间:该情况的扩展方法是,在堆空间上另外找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址
2.原理
- realloc会找一个更大的空间
- 将原来的数据拷贝到新空间内
- 释放旧空间
- 返回新空间的地址
注意:
- ①中返回的是旧的地址二;②中返回的是新地址,使用realloc前后返回的地址不同
- realloc申请空间失败的话会返回空指针
3.应用
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>文章来源:https://www.toymoban.com/news/detail-416330.html
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
//申请
int* p = (int*)malloc(20);
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
//使用
int i = 0;
for (i = 0; i < 5; i++)
{
p[i] = i + 1;
}
//申请空间
int* str = (int*)realloc(p, 40);
if (str != NULL)
{
p = str;
}
//使用
for (i = 5; i < 10; i++)
{
p[i] = i + 1;
}
//释放
free(p);
p = NULL;
return 0;
}
最后
本篇简单介绍了动态内存开辟需要用到的函数,下一篇会讲解动态内存中常见的错误,喜欢本专栏的可以点个订阅,让我们一起进步!文章来源地址https://www.toymoban.com/news/detail-416330.html
到了这里,关于【C语言跬步积累】——动态内存管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!