引言:数组的元素存储于内存中连续的位置上。当一个数组被声明时。它所须要的内存在编译时就被分配。

可是,我们能够使用动态内存分配在执行时为它分配内存。



一块内存的生命周期能够分为四个阶段:分配、初始化、使用、释放。

内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size))。

关于malloc函数应该注意一下几点:

1、malloc的參数就是须要分配的内存的字节数。

2、malloc所分配的是一块连续的内存。

3、分配成功。则返回指向分配内存起始地址的指针。分配失败,返回NULL指针。

4、对每一个malloc返回的指针都进行检查,是好的习惯。

内存的初始化一般要在使用之前手动进行,也能够在分配时由calloc函数一同完毕:将分配内存初始化为0。

使用就是使用分配所返回的指向内存的指针。

释放内存是为了防止内存泄露,一般使用free函数(原型:void free(void *pointer))完毕。它的參数必须是先前从malloc、calloc或realloc返回的值。向free传递一个NULL參数不会产生不论什么效果。向free传递其它參数会出错。

注意:常见的动态内存错误有下面几种

1、忘记对NULL指针进行解引用操作,即忘记对分配返回的值做推断。

2、对分配的内存进行操作时越过边界。

3、释放并不是动态分配的内存,传递给free的必须是一个从malloc、calloc或realloc返回的指针。

4、试图释放一块动态分配的内存的一部分。

5、一块动态内存被释放后被继续使用。

使用动态内存的编程总结:

1、动态内存分配有助于消除程序内部存在的限制。

2、使用sizeof计算数据类型的长度,调高程序的可移植性。

补充:calloc和realloc函数

void *calloc(size_t nmemb, size_t size);

void *realloc(void *ptr, size_t size);

calloc与malloc的差别一是前者返回指向内存的指针之前把它初始化为0.二是calloc的參数包含所需元素的数量和每一个元素的字节数。依据这些值,可以计算出总共须要分配的内存。

realloc函数用于改动一个原先已经分配的内存卡的大小。使用该函数,能够使一块内存扩大或缩小。假设原先的内存卡无法改变大小。realloc将分配还有一块正确大小的内存,并把原先那块内存的内容拷贝到新的块上。

【C语言天天练(九)】动态内存分配的更多相关文章

  1. [C语言] 数据结构-预备知识动态内存分配

    动态内存分配 静态内存分配数组 int a[5]={1,2,3,4,5}  动态内存分配数组 int len=5; int *parr=(int *)malloc(sizeof(int) * len) ...

  2. 数据结构基础(1)--数组C语言实现--动态内存分配

    数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...

  3. C语言学习笔记--动态内存分配

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...

  4. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  5. 郑州尚学堂:链表的C语言如何实现动态内存分配

    一.为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组.比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数 ...

  6. 重拾c语言之动态内存分配

    动态内存分配 传统数组的缺点: 1数组长度必须事先制定,且仅仅能是长整数不能是变量 2传统形式定义的数组该数组的内存程序无法手动释放 3数组一旦定义,系统就会为该数组分配的存储空间就会一直存在直到该函 ...

  7. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  8. iOS开发——C篇&动态内存分配

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...

  9. 数据结构基础——指针及动态内存分配(malloc)

    一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...

随机推荐

  1. PyCharm 社区版创建Django项目的一个方法

    PyCharm 社区版创建项目无法选择Django等项目,只能选择Python项目. 你在进行练习的时候为了方便,可以用过期了的PyCharm专业版在可用的30分钟内创建社区版本不支持的项目,再用Py ...

  2. 解决windows管理员已阻止你运行此应用问题

    按WIN+R键,打开“运行”,然后输入“gpedit.msc",就是打开组策略,这个在控制面板中也可以打开. 在组策略里找到“计算机配置”-“Windows设置”-“安全设置”-“本地策略” ...

  3. ACM训练联盟周赛 K. Teemo's reunited

    Teemo likes to drink raspberry juice.  He even spent some of his spare time tomake the raspberry jui ...

  4. leetcode刷题——排序

    知识点 CS-Notes 备忘-必备算法 题目 冒泡排序 插入排序 归并排序 选择排序 快速排序 希尔排序 堆排序 桶排序 题解 CS-Notes awesome-algorithm

  5. HDU 2476 区间DP String painter

    题解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  6. python基础学习笔记——生成器与推导式

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  7. idea14配置tomcat

    1.File -> New Project ,进入创建项目窗口 2.在 WEB-INF 目录下点击右键,New -> Directory,创建 classes 和 lib 两个目录 3.F ...

  8. IOS UITest 初始化 ViewController

    import XCTest @testable import UITestDemo class UITestDemoTests: XCTestCase { var homevc:HomeViewCon ...

  9. 学习笔记7——wp版本更新需要注意的问题

    平时开发时应该避免修改wp的核心代码, 因为在升级wp版本时,核心代码都会被覆盖, wp升级时只有wp-content文件夹不会被覆盖.

  10. xtu数据结构 B. Get Many Persimmon Trees

    B. Get Many Persimmon Trees Time Limit: 1000ms Memory Limit: 30000KB 64-bit integer IO format: %lld  ...