程序中内存应该如何分配?怎样进行动态内存分配?

电子说

1.3w人已加入

描述

程序在内存中是分段存储的。 

代码段:存放语句转换的数字;程序运行时不可修改; 全局段:用来记录全局变量和静态变量的存储位置;不会随着程序的运行而改变; 栈:存放局部变量,块变量,形式参数和返回值的存储位置;随着程序的运行其大小将不断改变;函数调用时,开辟空间,函数调用结束收回其空间;不同调用函数之间遵循后进先出的原则。 堆:存放动态分布的存储位置; 

代码

一:传统数组(静态数组)的缺点

1:数组的长度必须事先指定,并且是常整数,不能是变量 int a[5]; 2:传统数组程序员无法由程序员释放,只能由系统释放。(并且只能在数组所在函数结束才能释放) 3:数组的长度在函数运行期间不能动态的扩充和缩小 4:A函数定义的传统数组,在A函数结束时,在B函数中是不能使用的,因为已经释放。也就是传统数组不能跨函数。

区分:静态存储与内存的静态开辟

二:为什么要动态分配内存

用来解决传统数组的四个缺陷

三:动态内存分配举例,以及动态数组的构造

方式:malloc函数,在堆开辟空间 

代码

1:malloc是由程序员在堆栈动态开辟空间 2:返回值开辟空间的首地址,但是类型是void *,需要强制类型转换 3:分配的内存空间应该能整除类型所占的字节数 4:包含头文件malloc.h 5:只能用free(p)来释放p所指向的动态开辟的内存空间。 6:对动态内存空间的操作,用*p来操作。 7:可以用多个指针指向这个动态空间 8:当有多个指针只向这个动态空间时,只能用free一个指针,多次重复释放要被报错 9:可以将动态开辟的的内存指针作为函数参数

问题:p的分配类型是动态的还是静态的?当调用free(p)后,p的内存空间会被释放么? 例子:动态构建一个一维数组:

代码

动态扩充数组的长度,也就是在程序运行时动态扩充:realloc(首地址,总共字节数) 作用:将原来动态开辟的动态内存重新开辟一个字节数,如果这个数比以前的大,前面的数据保存。如果比原来的小,保留前面的数据。

代码

注意:扩充或者缩放的内存单元是新开辟的内存单元。这个过程中有值的拷贝过程。返回值是新开辟的地址空间首地址。

四:静态内存和动态内存的比较

静态开辟的内存:在栈中开辟,由编译器分配,由系统自动释放 动态开辟的内存:在堆中开辟,由程序员开辟,由程序员自动释放。

五:跨函数使用内存的问题

代码

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分