(十三)指针 -- 5. 动态分配

5. 动态分配

  • 静态分配(static allocation)
    当声明一个全局变量时,编译器给在整个程序中持续使用的变量分配内存空间,这种分配方式称为静态分配,因为变量分配到了内存的固定位置。

  • 自动分配(automatic allocation)
    当在函数中声明一个局部变量时,给该变量分配的空间在系统栈中。调用函数时给变量分配内存空间,函数返回时释放该空间,这种分配方式称为自动分配。

  • 动态分配(dynamic allocation)
    能在需要新内存的时候得到内存,不需要内存时就显式释放这部分内存,这种在程序运行时获取新内存空间的过程称为动态分配。


当程序载入内存时,通常只占用可用空间的一部分。在大多数系统中,当程序需要更多内存时,可以将一些未使用的内存空间分配给程序。

例如,如果程序运行时,需要一个新的数组空间,可以预留部分未分配的内存,将其余的内存留到后面分配。

  • 堆(heap)
    程序可用的未分配的内存资源。

作为库接口stdlib.h的一部分,ANSIC语言的环境提供了一些从堆中分配新的内存的函数。

最重要的一个函数为malloc,它能分配一块固定大小的内存。

待分配的内存块的大小以字节为单位给出(一个字节是足够存放一个字符值的内存单元)。

例如,如果要分配10个字节的内存,可调用

malloc(10)

结果会返回一个指针,指向一个10字节大小的内存块。

为了使用新分配的空间,必须将malloc的结果存放在一个指针变量内,以后就可以像使用数组一样使用该指针变量了。



5.1 Void* 类型

在C语言中,指针是具有类型的。

malloc函数用于为调用函数需要的任何类型的值分配新的内存空间,所以必须返回一个未确定类型的“通用”指针。

在C语言中,通用指针类型是一个指向空类型void的指针,void也用于指示无返回值或参数列表为空的函数。


如果声明一个指向void类型的指针, 如

void *vp;

可以将任何类型的指针值存入该变量,但不允许用*运算符间接引用vp。编译器不知道vp的基本类型是什么,所以没有办法谈论vp指向的值。


void*类型的用处在于,允许函数,特别是malloc函数,返回以后由调用函数创建实际类型的通用指针。

malloc函数返回类型为void*的指针值,表明其原型为:

void *malloc(int nBytes);

注意,这个函数原型的结果类型与指针变量的声明方法非常相似。
*表示结果是和函数名而非基本类型相联系的指针,尽管在概念上,结果是与基本类型而非函数名联系的。


ANSI C能在指向void的指针类型和指向基本类型的指针类型间自动进行转换。

例如, 如果声明字符指针cp为:

char *cp;

可以用语句

cp = malloc(10);

malloc的结果直接赋给cp

也可以使用强制类型转换将malloc返回的结果转换成指向字符的指针:

cp = (char*)malloc(10);

这样做的一部分原因是历史因素,另一部分原因是能使指针类型间的转换更清楚。


不管有没有明确使用强制类型转换,这条语句均可分配10个字节的新内存空间,并将第一个字节的地址存放在cp中。

常见错误:
一定要分清过程原型“void f(…);”和函数原型“void *f(…);”,后者声明了一个返回通用指针的函数。



5.2 动态数组

从概念上讲,赋值语句

cp = (char*)malloc(10);

建立了如下内存配置:

变量cp指向已经在堆内分配的连续10个字节。因为指针和数组在C语言中能自由地相互转换,所以变量类似于声明为一个含10个字符的数组。

  • 动态数组(dynamic array)
    分配在堆上并用指针变量引用的数组称为动态数组。

一般来说,分配一个动态数组包含以下步骤:

(1) 声明一个指针变量,用以保存数组基地址。

(2) 调用malloc函数为数组中的元素分配内存。由于不同的数据类型要求不同大小的内存空间,所以malloc调用必须分配的字节大小等于数组元素数乘以每个元素字节大小的内存空间。

(3) 将malloc的结果赋给指针变量。


比如,要给一个含10个元素的整型数组分配空间,然后将该内存赋给变量arr,必须先用

int *arr;

声明arr,随后使用

arr = malloc(10 * sizeof(int));

来分配空间。


声明数组和动态数组的主要区别是:

与一个已声明的数组相关的内存是作为声明过程的一部分自动分配的。
当声明数组的函数帧建立时,数组中所有的元素都作为帧的一部分进行分配。
在动态数组的情况下,实际内存在调用malloc函数前是不会被分配的。

在程序中,已声明的数组大小必须是不变的。而由于动态数组的内存来自于堆,所以它们的大小可以是任意的。
而且,可以根据数据量推断数组的大小。如果知道需要一个含N个元素的数组,可以保留大小正好的内存空间。



5.3 查找malloc中的错误

由于计算机内存系统的大小是有限的,堆的空间终会用完。此时malloc返回指针NULL表示分配所需内存块的工作失败。

应该在每次调用malloc时都检查失败的可能性。所以,分配一个动态数组后,需要写如下语句:

arr = malloc(10 * sizeof(int));
if (arr == NULL)
    Error("No memory available.");

当空间用完时,程序显示出错消息并且停止运行通常是唯一可行的方法。

所以,调用malloc并将其嵌入一个包括内存不够测试的新抽象层中是很有用的。


genlib.h接口输出函数GetBlock,并对NULL结果进行测试。

如果GetBlock函数检测到内存不够的情况,就会调用Error函数。

因此,以上两行代码可以替换为:

arr = GetBlock(10 * sizeof(int));

GetBlock函数的执行结合了分配内存和检测错误的操作,使内存分配的操作更清晰,程序更易懂。


为进一步简化分配动态数组的过程,genlib.h库还定义了函数NewArray

NewArray取元素数和其基本类型后返回一个指针,指向特定大小的动态数组。

因此,要分配一个含50个字符串的动态数组,应调用:

NewArray(50, string)


5.4 释放内存

保证不会发生内存不够的一种方法是,一旦使用完已分配的空间就立刻释放它。

标准ANSI库提供了函数free,用于归还以前由malloc分配出去的堆内存。

例如,如果能肯定已经不再使用分配给arr的内存,可以通过调用

free(arr);

释放该空间。

genlib.h接口也包括一个FreeBlock函数,其操作方法和free完全相同。


但事实证明,知道何时释放一块内存并不那么容易。根本问题在于分配和释放内存的操作分别属于接口两边的实现及客户。

实现知道何时该分配内存,返回指针给客户,但它并不知道何时客户结束使用已分配的对象,所以释放内存是客户的责任。


对现在的大多数计算机的内存来说,可以随意分配所需内存而不需要考虑释放内存的问题。

这种策略几乎对所有运行时间不长的程序还是有效的。

内存有限的问题只有在设计一个需要运行很长时间的应用,比如所有其他系统所依靠的操作系统时,才变得有意义。

某些语言支持那些能主动检查正在使用的内存,并释放不再使用的内存的动态分配系统,此策略称为碎片收集(garbage collection)。





参考

《C语言的科学和艺术》 —— 13 指针

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S-Function 可以使用MATLAB®,C,C ,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解器相互作用,这与发生在求解器和内置Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。 S-function 为你提供了一种在Simulink 模型中增加自制块的手段,你可以使用MATLAB,C,C ,Ada,或Fortran 语言来创建自己的块。按照下面一套简单的规则,你可以在S-function 中实现自己的算法。在你编写一个S-Functin 函数,并将函数名放置在一个S-Functin 块中(在用户定义的函数块库中有效)之后,通过使用masking 定制用户界面。 目录 S-FUNCTION 概述.......... 1 什么是 S-FUNCTION...... 2 在模型中使用S-FUNCTION...... 3 向 S-Function 传递参数....... 3 何时使用 S-Function 4 S-FUNCTION 的工作原理.......... 5 Simulink 块的数学关系........ 5 仿真过程......... 5 S-Function 回调程序. 6 S-FUNCTION 的实现...... 8 M-文件的S-Function.......... 8 MEX 文件的S-function ....... 8 MEX 文件与M-文件的S-function 比较... 9 S-FUNCTION 的概念..... 10 直接馈通....... 10 动态维矩阵... 10 设置采样时间和偏移量.......11 S-FUNCTION 范例........ 14 M 文件S-function 范例...... 15 C S-Function 范例... 16 Fortran S-Function 范例.... 18 C S-Function 范例......... 18 Ada S-Function 范例......... 18 编写 M S-FUNCTION.... 19 概述........ 20 S-Function 参数...... 20 S-Function 的输出... 20 定义 S-FUNCTION 块特性....... 22 处理 S-FUNCTION 参数 22 M 文件的S-FUNCTION 范例... 23 范例 1——简单的M 文件S-Function ... 23 范例 2——连续状态S-Function . 25 范例 3——离散状态S-Function . 27 范例 4——混合系统S-Function . 28 范例 5——变步长S-Function ..... 31 ii 使用C 语言编写S-FUNCTION .......... 33 概述........ 34 创建 C MEX S-Function.... 35 自动生成 S-FUNCTION 36 配置生成的 S-Function...... 37 S-Function Builder 如何生成S-Function......... 37 设置 include 路径.... 37 S-FUNCTION BUILDER 的对话窗........ 39 Initialization 选卡..... 39 Data Properties 选卡......... 40 Libraries 选卡.......... 42 Outputs 选卡 43 Continuous Derivatives 选卡....... 45 Discrete Update 选卡........ 46 Build Info 选卡........ 47 一个基本的 C MEX S-FUNCTION 范例....... 48 定义与包含... 49 回调函数的实现...... 50 Simulink/Real-Time Workshop 接口..... 51 Building Timestwo 范例..... 51 C S-FUNCTION 模板..... 52 S-Function 源文件必需的内容..... 52 SimStruct...... 53 编译 C S-Function.. 53 SIMULINK 如何与C S-FUNCTION 相互作用 54 进程层面....... 54 数据层面....... 56 编写回调函数... 59 将 LEVEL 1 C MEX S-FUNCTION 转换到LEVEL 2 . 60 创建 C S-FUNCTION 63 创建 ADA S-FUNCTION.......... 64 创建 FORTRAN S-FUNCTION 65 实现块特性 67 对话框参数....... 68 iii 可调参数....... 68 运行参数 70 创建运行参数.......... 70 更新运行参数.......... 71 创建输入和输出端口... 72 创建输入端口.......... 72 创建输出端口.......... 73 输入的标量扩展...... 74 掩码多端口 S-Function...... 75 自定义数据类型.......... 76 采样时间 77 基于块的采样时间... 77 指定基于端口的采样时间.. 79 基于块与基于端口的混合采样时间 ........ 81 多速率 S-Function 块......... 82 多速率 S-Function 块的同步........ 83 工作向量 84 工作向量与过零检测.......... 85 包括指针工作向量的范例.. 85 内存分配....... 86 FUNCTION-CALL 子系统.......... 87 错误处理 89 防超程代码... 89 SsSetErrorStatus 的终止条件..... 90 数组边界检查.......... 90 S-FUNCTION 范例........ 91 连续状态的 S-Function 范例........ 92 离散状态的 S-Function 范例........ 93 混合系统的S-Function 范例........ 93 变步长的 S-Function 范例. 94 过零检测的 S-Function 范例........ 94 时变连续传递函数的 S-Function 范例... 94
S-FUNCTION 概述 .................................................................................................................................... 1 什么是 S-FUNCTION................................................................................................................................ 2 在模型中使用 S-FUNCTION.................................................................................................................... 3 向 S-Function 传递参数..................................................................................................................... 3 何时使用 S-Function.......................................................................................................................... 4 S-FUNCTION 的工作原理........................................................................................................................ 5 Simulink 块的数学关系...................................................................................................................... 5 仿真过程.............................................................................................................................................. 5 S-Function 回调程序.......................................................................................................................... 6 S-FUNCTION 的实现................................................................................................................................ 8 M-文件的 S-Function......................................................................................................................... 8 MEX 文件的 S-function ..................................................................................................................... 8 MEX 文件与 M-文件的 S-function 比较........................................................................................... 9 S-FUNCTION 的概念.............................................................................................................................. 10 直接馈通............................................................................................................................................ 10 动态维矩阵........................................................................................................................................ 10 设置采样时间和偏移量.....................................................................................................................11 S-FUNCTION 范例.................................................................................................................................. 14 M 文件 S-function 范例.................................................................................................................... 15 C S-Function 范例............................................................................................................................ 16 Fortran S-Function 范例.................................................................................................................. 18 C++ S-Function 范例....................................................................................................................... 18 Ada S-Function 范例 ....................................................................................................................... 18 编写 M S-FUNCTION.............................................................................................................................. 19 概述........................................................................................................................................................ 20 S-Function 参数................................................................................................................................ 20 S-Function 的输出............................................................................................................................ 20 定义 S-FUNCTION 块特性..................................................................................................................... 22 处理 S-FUNCTION 参数......................................................................................................................... 22 M 文件的 S-FUNCTION 范例................................................................................................................. 23 范例 1—— 简单的 M 文件 S-Function ........................................................................................... 23 范例 2—— 连续状态 S-Function .................................................................................................... 25 范例 3—— 离散状态 S-Function .................................................................................................... 27 范例 4—— 混合系统 S-Function .................................................................................................... 28 范例 5—— 变步长 S-Function ........................................................................................................ 31 使用 C 语言编写 S-FUNCTION ............................................................................................................. 33 概述........................................................................................................................................................ 34 创建 C MEX S-Function.................................................................................................................. 35 自动生成 S-FUNCTION.......................................................................................................................... 36 配置生成的 S-Function.................................................................................................................... 37 S-Function Builder 如何生成 S-Function...................................................................................... 37 设置 include 路径 ............................................................................................................................. 37 S-FUNCTION BUILDER 的对话窗........................................................................................................... 39 Initialization 选卡.............................................................................................................................. 39 Data Properties 选卡 ....................................................................................................................... 40 Libraries 选卡.................................................................................................................................... 42 Outputs 选卡..................................................................................................................................... 43 Continuous Derivatives 选卡.......................................................................................................... 45 Discrete Update 选卡 ...................................................................................................................... 46 Build Info 选卡 .................................................................................................................................. 47 一个基本的 C MEX S-FUNCTION 范例 ............................................................................................... 48 定义与包含........................................................................................................................................ 49 回调函数的实现................................................................................................................................ 50 Simulink/Real-Time Workshop 接口 ............................................................................................. 51 Building Timestwo 范例................................................................................................................... 51 C S-FUNCTION 模板.............................................................................................................................. 52 S-Function 源文件必需的内容........................................................................................................ 52 SimStruct........................................................................................................................................... 53 编译 C S-Function............................................................................................................................ 53 SIMULINK 如何与 C S-FUNCTION 相互作用 ........................................................................................ 54 进程层面............................................................................................................................................ 54 数据层面............................................................................................................................................ 56 编写回调函数........................................................................................................................................ 59 将 LEVEL 1 C MEX S-FUNCTION 转换到 LEVEL 2 .............................................................................. 60 创建 C++ S-FUNCTION.......................................................................................................................... 63 创建 ADA S-FUNCTION......................................................................................................................... 64 创建 FORTRAN S-FUNCTION.............................................................................................................. 65 实现块特性................................................................................................................................................ 67 对话框参数............................................................................................................................................ 68 可调参数............................................................................................................................................ 68 运行参数................................................................................................................................................ 70 创建运行参数.................................................................................................................................... 70 更新运行参数.................................................................................................................................... 71 创建输入和输出端口............................................................................................................................ 72 创建输入端口.................................................................................................................................... 72 创建输出端口.................................................................................................................................... 73 输入的标量扩展................................................................................................................................ 74 掩码多端口 S-Function.................................................................................................................... 75 自定义数据类型.................................................................................................................................... 76 采样时间................................................................................................................................................ 77 基于块的采样时间............................................................................................................................ 77 指定基于端口的采样时间................................................................................................................ 79 基于块与基于端口的混合采样时间 ................................................................................................ 81 多速率 S-Function 块....................................................................................................................... 82 多速率 S-Function 块的同步........................................................................................................... 83 工作向量................................................................................................................................................ 84 工作向量与过零检测........................................................................................................................ 85 包括指针工作向量的范例................................................................................................................ 85 内存分配............................................................................................................................................ 86 FUNCTION-CALL 子系统........................................................................................................................ 87 错误处理................................................................................................................................................ 89 防超程代码........................................................................................................................................ 89 SsSetErrorStatus 的终止条件 ........................................................................................................ 90 数组边界检查.................................................................................................................................... 90 S-FUNCTION 范例.................................................................................................................................. 91 连续状态的 S-Function 范例........................................................................................................... 92 离散状态的 S-Function 范例........................................................................................................... 93 混合系统的 S-Function 范例........................................................................................................... 93 变步长的 S-Function 范例............................................................................................................... 94 过零检测的 S-Function 范例........................................................................................................... 94 时变连续传递函数的 S-Function 范例........................................................................................... 94

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值