文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言动态内存函数详解

2024-04-02 19:55

关注

动态开辟空间的原因

静态开辟空间是固定的,数组在申明的时候必须指定数组的长度,在编译的时候分配内存,但是我们在实际情况中对于内存空间的需求,不仅仅是上述的情况,有时候我们需要的空间只有在运行之后才能知道,所以需要开辟一个动态内存空间,满足更多需求。

1、malloc函数

void* malloc (size_t size);

malloc函数是向内存申请一块连续的空间,并返回指向这块空间的指针,如果开辟成功则指向开辟好的空间,如果开辟失败,则返回NULL,所以在使用之前要对开辟的空间进行一个判断。malloc函数的返回值是void*,所以在具体使用的时候可以由我们来指定。

给一个int型数组开辟动态空间
int *p=(int *)malloc(sizeof(int)*n);
(int *)给malloc强转一下,之后我们给数组开辟空间,可以用sizeof(int)*n这样我们就可以只改变n的大小。

我们也可以给一个结构体开辟动态空间
//假设结构体名为student
student *ptr=(student *)malloc(sizeof(student));

2、free函数

void free (void* ptr);

当我们给变量开辟了动态空间后使用完需要进行释放,否则有可能会出现内存泄漏的问题。

释放的时候就是在使用完整个变量后free掉
free( p);
free(ptr);
我们将空间释放后指针其实还指向的是原来的空间,只是内部存储的数据全部释放了,所以为了防止形成野指针,我们要在free的后面讲指针赋为空。
free( p);
p=NULL;
free(ptr);
ptr=NULL;

当然释放过的空间不能重复释放
free( p);
free( p);
free( p);
这样是会报错的,不能重复释放一个已经释放的空间
但是下面这样是可以的,将指针所指的地址变为空
free( p);
p=NULL;
free( p);

3、calloc函数

void* calloc (size_t num, size_t size)

calloc函数的功能是为num个大小为size的元素开辟一块空间,它的作用和malloc相似,但是calloc与malloc函数不同之处在于,他可以在开辟空间的同时把空间的每个字节初始化为0。

用法和malloc函数一致
int *p=(int *)calloc(10,sizeod(int));
释放的时候也与malloc函数一致
free( p);
p=NULL;

所以我们要对申请的内存空间初始化时,可以直接使用calloc函数

4、realloc函数

void* realloc (void* ptr, size_t size)

我们有时会发现之前申请的空间太大或者太小的不合适的时候,就可以利用realloc函数对动态开辟的空间进行调整,realloc函数的出现也让动态内存管理更加的灵活。

int *p=(int *)malloc(sizeof(int)*10);
p=(int *)realloc(p,sizeof(int)*20);空间改大
p=(int *)realloc(p,sizeof(int)*5);空间改小
空间改大改小都是可以的

realloc函数的实质其实是另外开辟一个更大或者更小的空间,将原来的数复制过去,复制过去之后再将原来的空间释放掉,所以会保留原本的数据。


int *ptr=(int *)malloc(100);
int *p=NULL;
p=(int *)realloc(ptr,20);
if (p != NULL)
{
ptr=p;
}
free(ptr);
ptr=NULL;

在实际运用时将新开辟的空间赋给一个新的变量可以更好地保护程序,因为如果新的空间开辟失败了我们也不会将原本的空间丢失,还能将原本的空间保留。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯