存储空间分配

挡在C中声明一个指针时,与声明其他类型的变量类似,一定量的存储空间会分配给这个指针。通常情况下指针会占用一个机器字长的存储空间,但有些时候他们的大小也有所不同。因此 为了保证代码的可移植性,不应该假设每个指针都占有一个特定大小的存储空间,指针变量的大小通常与编译器的设定以及某些特定的C实现中的类型界定符有关。必须要记住的一点是:当声明一个指针时,仅仅只是为指针本省分配了空间,并没有为指针所引用的数据分配空间。而为数据分配存储空间有两种方法:一种是直接声明一个变量;另一种是在运行时动态地分配存储空间(例如:使用malloc或realloc).

当声明一个变量时,编译器会根据变量的类型预留足够的内存空间。变量的存储空间是系统自动分配的,但此存储空间不会在程序的整个生命周期中永久存在,这一点在处理自动变量时尤为重要。自动变量是一种在进入或离开模块或函数时存储空间能够自动分配和释放的变量。例如:在函数f中,iptr的赋值为变量a的地址,当函数f返回时,iptr变成了一个悬空指针。为什么会这样?因为当函数f返回时,变量a已经从函数栈中弹出,变成一个不合法的变量(见第3章)。

在C语言中,当想要动态分配存储空间时,我们会得到一个指向一个堆存储空间的指针(见第3章)。此存储空间由我们自行管理,并不会一直存在,除非我们显示地将它释放。例如:在下面这段代码中用malloc分配的存储空间会一直到调用函数free来释放它。所以,当函数g返回时此存储空间仍然有效(见图2-2),这一点与之前自动分配存储空间的变量完全不同。参数iptr是一个指向我们想要改变其内容的对象的指针(此对象也是一个指针)所以当g返回时.iptr指向有malloc申请的地址空间.我们会在2.4节进一步探讨这个问题。

图 2-2:函数中返回动态分配的存储空间的指针操作

有些时候,我们甚至会认为指针和动态存储空间分配是C语言领域中不太好的特性。特别是当产生了由动态内存分配所造成的内存泄漏问题时。内存泄漏问题的产生是由于动态分配了内存空间,但从未释放它(甚至在程序不再使用此数据空间时都不释放它)造成的。特别是在重复执行代码时,这种泄漏完呢提会表现得尤为严重。好在我们可以采用统一的内存管理方法大大减少此类问题。一种统一的内存管理方法例子就是本书中所用到的数据结构实例。每种实例所遵循的理念是,由用户来管理存储空间以及与存储空间相关的实际的数据结构,而数据结构自身只用于维护数据内部变量的存储空间分配。所以,在数据结构中,只适用指针所指向数据变量,而不是比数据的私有副本。这种应用的一个重要意义在于,一个数据结构的实现并不依赖与它所存储的数据类型和大小。同时,多个数据结构能够以单个数据形态表现,这个特性在组织大量数据时非常有用。

此外,本书还提供同了如何初始化和销毁结构的操作。初始化可能会涉及很多步骤,其中之一便是内存分配。销毁数据结构通常包括删除它所有的数据,并释放数据结构所用到的内存。释放数据结构的内存往往也包含释放与数据结构本上相关的所有内存。这里有一个例外,那就是让用户自己管理数据的存储。之所以每个数据结构在舒适化的时候都需要使用由用户提供的初始化函数,是因为数据存储的管理实际上是一种与具体应用相关的操作。

算法精解 c语言 源码,算法精解七(C语言版)相关推荐

  1. rsa加密c语言源码库,RSA加密算法源代码C语言实现.doc-资源下载在线文库www.lddoc.cn...

    RSA加密算法_源代码__C语言实现.doc RSA 算法 1978 年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名Ro ...

  2. 基于文本 c语言,[源码和文档分享]基于C语言实现的文件系统

    1 实验目的 学习FAT文件系统的构成 能够将自己的程序应用在系统上 熟悉dd,mount,umount,等指令 设计并实现一个目录列表函数(无须支持选项,如ls -a.ls -l等),用来显示当前目 ...

  3. c语言源码转流程图工具在线,c语言源码转流程图工具_应用|1+1构造地表最强流程图工具...

    大家知道我是一个"24K资深"通信工程师,所以日常画画拓扑图.信令流程图.产品逻辑图等等都是必备技能,但是苦无Visio久矣,所以每次画图都一个脑袋两个大. 每次不是在Word里就 ...

  4. dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

    DSP课程设计-基于C语言实现256点的FFT精选 XX 大学 J1111111 UNIVERSITY DSP 课 程 设 计 基于CCS 的FFT 算法的C 语言实现和验证 学院名称: 专业班级: ...

  5. 汽车技术管理系统c语言,[源码和文档分享]基于C语言实现的汽车牌照的快速查询...

    1 课题概述 1.1 课题任务 在汽车数据的信息模型中,汽车牌照是具有结构特点的一类关键字.汽车牌照是字母和数字混编的,例如01B7238.利用查找和排序算法,实现辽宁省内汽车牌照的快速查找. 设计汽 ...

  6. apache c语言源码,Apache模块开发/用C语言扩展apache(2:APR编程介绍)

    Apache模块开发/用C语言扩展apache(2:APR编程介绍) by linux_prog 可以看到apache代码中使用了大量的以apr_开头的结构或者函数,这些其实是APR. 什么是apr  ...

  7. 【安全算法之SHA1】SHA1摘要运算的C语言源码实现

    [安全算法之SHA1]SHA1摘要运算的C语言源码实现 概述 头文件定义 C语言版本的实现源码 测试用例 github仓库 更多参考链接 概述 大家都知道摘要算法在安全领域,也是一个特别重要的存在,而 ...

  8. 【安全算法之DES】DES算法(支持ECB/CBC模式)的C语言源码实现

    [安全算法之DES]DES算法(支持ECB/CBC模式)的C语言源码实现 概述 头文件定义 C语言版本的实现源码 数据分组模式:ECB模式和CBC模式 测试用例 github仓库 更多参考链接 概述 ...

  9. 【安全算法之SHA512】SHA512摘要运算的C语言源码实现

    [安全算法之SHA512]SHA512摘要运算的C语言源码实现 概述 头文件定义 C语言版本的实现源码 测试用例 github仓库 更多参考链接 概述 大家都知道摘要算法在安全领域,也是一个特别重要的 ...

  10. 【 反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10)】

    反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10) 数学推导 BP算法 BP神经网络可以说机器学习的最基础网络.对于普通的简单 ...

最新文章

  1. oracle11g分区表按时间自动创建
  2. 【UVA】11991 Easy Problem from Rujia Liu? (整数v第k次出现在什么位置)
  3. 看傻眼了,真的是软件测试福利来了,最全资料包
  4. Redisson实现Redis分布式锁的N种姿势
  5. C++ C++11新特性--右值引用
  6. 计算机运算方法与机器指令
  7. .NET网络编程学习(三)--网络蜘蛛程序(Spider)
  8. Notepad++ 安装jsonview插件
  9. 软件工程专业学生的自我反思
  10. Centos7二进制安装Mysql8.0.20
  11. Ubuntu一些基本软件安装方法
  12. 母亲节活动策划方案PPT模板
  13. python调用pyd_使用python pyd时出错
  14. C++中deprecated笔记
  15. python小欢喜(二)神奇的小海龟(1) 绕圈子把自己都绕晕了
  16. java POI Excel插入图片
  17. “Apache官网打不开”怎么办?
  18. 微博【黄金分析师吕超】--2.16黄金分析
  19. Windows11 hosts 文件无法修改怎么办?
  20. 微信朋友圈点赞设计测试用例

热门文章

  1. modelsim与quartus仿真的区别
  2. 演化博弈的仿真分析 基于matlab
  3. 下载sqlserver2012 试用_大肥虫助手下载-大肥虫助手 安卓版v7.0.4
  4. PyTorch :transforms的二十二个方法
  5. 算法 - 差分进化(DE)算法
  6. 认知无线电的能量检测
  7. java:ToStringBuilder.reflectionToString重写toString
  8. android textwatcher 获取当前控件,android api解析之TextWatcher
  9. win7计算机桌面位置,win7系统更改桌面位置的操作方法
  10. ria技术_JavaFXpert RIA示例挑战截止日期已延长