C语言近程型(near)和远程型(far)的区别是什么?
DOS用一种分段结构来寻址计算机的内存,每一个物理存储位置都有一个可以用段一偏移量方式来访问的相关地址。例如,下面就是一个典型的段式地址:
A000:1234
冒号左边的部分代表段地址(A000),冒号右边的部分代表相对于段地址的偏移量。DOS下的每个程序都是按这种方式访问内存的——尽管段一偏移量寻址方法的机理对大多数C程序员来说是隐蔽的。
当你的程序被执行时,一个存放在数据段(DS)寄存器中的数据段地址将被赋给你的程序。这个缺省的数据段地址指向一个64KB的内存空间,这个空间通常就
被叫做近程型数据段。在这个近程型数据段空间中,你会找到程序的栈、静态数据和近程堆。近程堆用来为程序启动时所需的全局变量和其它数据元素分配内存,在
这个空间中分配的任何数据都被叫做近程型数据。例如,下面的程序在程序启动时从近程堆中分配了32KB的近程型数据:
/ * Note :Program uses the Medium memory model...* /
# include <stdio. h>
# include <alloc. h>
# include <string. h>
# include <stdlib. h>
# include <dos. h>
void main(void) ;
void main(void)
{
char * near_data;
near_data= (char * )malloc((32 * 1024) * sizeof(char)) ;
if (near data= = (char * )NULL)
{
printf("Whoopsie ! Malloc failed! \n") ;
exit(l) ;
}
strcpy (near_data,
"This string is going to be. stored in the near heap") ;
printf("Address of near_data : %P\n", ,&near_data) ;
free (near_data) ;
}
在上例中,near_data是一个字符指针,程序分配给它一个32KB的内存块。在缺省情况下,这个32KB的内存块是从近程堆中分配的,并且相应的16位地址将被存放在字符指针near_data中。
现在,你已经知道什么是近程型数据了,但你可能还不大明白什么是远程型数据,很简单,远程型数据就是位于缺省数据段(第一个64KB数据段)以外的数据。下例中的程序从远程型数据区(通常也叫做远程堆)中分配了32KB的空间:
/ * Note:Program uses the Medium memory model... * /
# include <stdio. h>
# include <alloc. h>
# include <string. h>
# include <stdlib. h>
#include <dos. h>
void main(void) ;
void main(void)
{
char far * far_data;
far_data= (char far * )farmalloc((32 * 1024) * sizeof(char)) ;
if (far data= = (char far*)NULL)
{
printf ("Whoopsie ! Far malloc failed ! \n") ;
exit (1) ;
}
fstrcpy(far data,
"This string is going to be stored in the far heap");
printf("Address of far_data : %Fp\n",&far_data) ;
farfree (far_data) ;
}
在这个例子中,远程型字符指针被赋予了一个32位地址,该地址对应于远程堆中一块32KB的可用内存。注意,为了明确地从远程堆中分配内存,必须使用一个
far指针,因此上例的字符指针定义中加入了远程型修饰符(far)。此外,你还要注意,从远程堆中分配内存的一些函数
(fareoreleft(),farmalloe(),farfree())和从近程堆中分配内存的函数是不同的。
远程堆中的可用内存通常比近程堆中的多得多,因为近程堆被限制在64KB之内。如果你在你的计算机上编译并运行前面的两个例子,你会发现第一个例子(从近
程堆中分配内存)大约有63KB的可用内存,而第二个例子(从远程堆中分配内存)大约有400KB到600KB(依赖于你的计算机配置)的可用内存。因
此,如果你的程序需要大量的内存来存储数据,你就应该使用远程堆而不是近程堆。
不管使用哪一种存储模式(Tiny存储模式除外),你都可以用near和far修饰符以及相应的近程型和远程型函数来明确地从近程堆和远程堆中分配内存。合理地使用近程型和远程型数据,将有助于提高程序的运行效率,减少程序用尽内存的危险。
注意,因为DOS使用的是段地址结构寻址机制,所以近程型和远程型数据的概念是运行DOS的PC机所独有的。其它操作系统,例如UNIX和Wndows NT,使用的是平面地址机制,没有近程型或远程型限制。
C语言近程型(near)和远程型(far)的区别是什么?的更多相关文章
- (转)C语言16进制输出字符型变量问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
- 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF
存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...
- Python基础:数值(布尔型、整型、长整型、浮点型、复数)
一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- Python中从SQL型数据库读写dataframe型数据
Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...
- java使用格式String型转成Date型
public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = &quo ...
- Atitit 3种类型的公司:运营驱动型;产品驱动型; 技术驱动型。
Atitit 3种类型的公司:运营驱动型:产品驱动型: 技术驱动型. 领导驱动,产品驱动,运营驱动还是工程师驱动 3种类型的公司: 一种是运营驱动型: 一种是产品驱动型: 一种技术驱动型. 运营驱动 ...
随机推荐
- sqlachemy中批量删除的问题
db.session.query(Article).filter(Article.id.in_(items)).delete() 报错: sqlalchemy.exc.InvalidRequestEr ...
- javascript mediator pattern
定义 定义一个对象,它封装一组相互作用的对象.中介者促使对象之间保持通讯但是又松耦合,你可以很独立的改变他们的相互作用. 提要 中介者提供一个权威中心,用来控制一组对象之间的相互作用.这种模式在这种情 ...
- python 调用函数 / 类型转换 / 切片/ 迭代
调用函数 / 类型转换 / 切片/ 迭代 1. 调用函数:abs(),max(),min() 2. 数据类型转换:int(),float(),str(),tool(),a=abs, 3. 定义函数, ...
- ativemq使用教程
本文转自http://www.cnblogs.com/zhuxiaojie/p/5564187.html 目录: 一:JMQ的两种消息模式 1.1:点对点的消息模式 1.2:订阅模式 二:点对点的实 ...
- C语言 · 9-1九宫格
算法提高 9-1九宫格 时间限制:1.0s 内存限制:256.0MB 问题描述 九宫格.输入1-9这9个数字的一种任意排序,构成3*3二维数组.如果每行.每列以及对角线之和都相等,打 ...
- Android——单例模式
详细的各种模式 http://mobile.51cto.com/android-419145.htm http://wenku.baidu.com/link?url=f3yjQ6YvslvHcWJLb ...
- java资料——线性表(转)
线性表 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单, ...
- datagrid中reoload提交时如何批量提交表单中的查询条件
看标题描述有点复杂,看下图: 直接将手工添加的一个个字段直接用一句代码完成. $('#dg_sub').datagrid("reload",$('#searchForm').ser ...
- 转载------让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
本文是转载及收藏 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在c ...
- 什么是Apache ZooKeeper?
Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据.ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务. Zo ...