【C语言】为什么存在动态内存分配
文章目录
- 前言
- 一、动态内存分配
- 定义
- 二、动态内存分配的意义
- 1.可以控制所开辟的内存大小
- 2.可以多次利用这部分空间
- 三,动态内存函数的介绍
前言
提示:我们先来看一个在vs编译器下,同学们常犯的错误
注意:在VS编译器下C语言是不支持变长数组的,我们应该输入一个常量值,如struct Stu s[100]={0};在C99中是支持变长数组的,不同编译器不同,gcc是支持C99的。
一、动态内存分配
定义
我们平常定义的局部变量都是在栈上分配空间的,(1)开辟的空间都是固定的大小,(2)数组在声明的时候,必须指定数组长度,它所需要的内存在编译时分配。这种分配固定大小内存的分配方法也称静态内存分配,与之相对的,就是动态内存分配。
动态内存分配的空间是在堆区申请的,不是在栈上申请的。
动态内存分配的空间由我们手动释放,由free()函数完成。而栈上开辟的空间函数调用完后会自动释放内存。
二、动态内存分配的意义
1.可以控制所开辟的内存大小
在很多时候,比如通讯录,学生管理表等等,我们不知道在为了会存下多少联系人,多少学生。如果我们用静态内存开辟就存在问题,可能会开辟少了,之后联系人和学生都存不了,可能会开辟多了,导致内存浪费。而动态内存就可以解决这个问题,我们可以用relloc控制大小,当内存达到申请的空间时,我们可以主动再申请连续的空间,进行扩容。
2.可以多次利用这部分空间
静态内存分配的空间,只有在程序结束时才会自动释放给系统。如果你都在栈区上开辟空间,对于大程序来说,还没运行完,内存就可能被占完了,此时就会发生内存泄漏。
而动态内存分配的空间,如果你用完了(比如你开辟了一块空间,打印10个元素,打印好了),我们可以用free()函数释放这块空间,并把维护这块空间的指针置为空指针。当再次用动态内存申请空间时,就可以再次利用这块空间。一定程度上可以节省空间。
三,动态内存函数的介绍
malloc free calloc realloc
这几个动态内存分配函数会在我的博客分别详解,有需要了解栈区,堆区,静态区的见我的博客:【C语言】初识内存开辟/分配
【C语言】为什么存在动态内存分配相关推荐
- c语言链表内存分配失败,链表的C语言实现之动态内存分配
链表的C语言实现之动态内存分配 來源:互聯網 2008-06-01 02:05:07 評論 一.为什么用动态内存分配 但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是 ...
- c语言链表动态分配内存,链表的C语言实现(含动态内存分配)
转自:http://blog.csdn.net/21aspnet/article/details/146968 链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一.为什么用动态 ...
- C语言中的动态内存分配
大家好,今天简单讲一讲C语言中的动态内存分配. 补充:C程序中的内存块. 在C程序中,通常将内存划分为以下六个区域: (1)内核区域.这块区域是操作系统的,用户不能使用. (2)栈区.主要用于存放运行 ...
- c语言 malloc_C语言快速入门——动态内存分配
在前面一系列的字符串操作中,我们都是先定义一个固定大小的字符数组,然后根据所需,或拷贝.或连接.或格式化来为这个数组提供内容.固定大小的数组意味着在程序运行期间,数组所占用的内存是确定的(即划分了固定 ...
- C语言 :学习动态内存分配
文章目录 C语言动态分配 为什么存在内存分配? 动态内存函数的介绍 `malloc` `free` `free`函数的**作用原理**是: 使用后将指针赋为`NULL` `calloc` 运用一次`c ...
- C语言学习笔记---动态内存分配
数组在内存中时存储在连续的位置上,当声明一个数组的时候,编译器就会在内存中分配它所需要的空间,但是有时候还需要使用动态内存为数组分配空间. 比如现在要同统计一个班级学生的成绩,可以申请一个固定 ...
- C++和C语言中的动态内存分配的区别
在C语言和C++中都会用到动态内存的申请分配的问题,两者之间申请动态内存分配还是区别的. 在C++中的动态内存的分配 1.C++通过new关键字进行动态内存的分配.new关键字是C++内置的一个关键字 ...
- c语言的四个函数,C语言学习之动态内存分配的四个函数
前面中我们了解到: int n; int arr[n]; 这样定义数组是不可取的,不能用此方法给数组分配动态内存,那怎么样才能实现这种可能呢? 接下来我将关于动态内存的知识做以下总结. 有关动态内存的 ...
- C语言,为什么动态内存分配申请后,还要再释放?
比如main函数里有一句 malloc(), 后面没有free() 1.那么当main结束后,动态分配的内存不会随之释放么? 2.如果程序结束能自动释放,那么还加上free(),是出于什么考虑? 1. ...
- C语言数组用到的动态内存分配
动态内存分配 在学习数组的过程中,在输入数组时,原本想过scanf定义数组的大小再输入数组的各值,却报错. 发现原因: 1.定义数组的时必须指定数组长度 2.数组长度是在编译期就必须决定的 所以此时需 ...
最新文章
- javax/management/DynamicMBean
- SAP MM 采购价格里的阶梯价格
- python猜数游戏在程序中预设一个_一道Python简单程序结构练习题
- CTF短秘钥的RSA解密
- java join使用实例_Java多线程中关于join方法的使用实例解析
- 卷积神经网络结构_卷积神经网络
- 响应式设计之 —— 视口
- 营收放缓、股价暴跌、高管离职,Facebook迎来至暗时刻?
- IIFP之牛刀小试(初识篇)
- 怎么样写一个 node.js模块以及NPM Package
- java day of month_Java LocalDateTime getDayOfMonth()用法及代码示例
- 希望是一个全新的开始
- 《行为科学统计7e(Statistics for the Behavioral Sciences 10e)》 Introduction to Statistics
- JDK安装 Java环境配置
- 系统指定的路径不存在,怎么办
- 合肥有哪些不错的 IT 公司?
- Web 通信 之 长连接、长轮询
- 补天漏洞平台为什么能吸引众多白帽和企业?
- 联想Lenovo IdeaPad-100s-14IBR安装win7系统
- Web前端HTML+CSS全套(1~20)