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)的区别是什么?的更多相关文章

  1. (转)C语言16进制输出字符型变量问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  2. C语言中以十六进制输出字符型变量会出现'ffffff"的问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  3. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  4. 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF

    存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...

  5. Python基础:数值(布尔型、整型、长整型、浮点型、复数)

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  6. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  7. Python中从SQL型数据库读写dataframe型数据

    Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...

  8. java使用格式String型转成Date型

    public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = &quo ...

  9. Atitit 3种类型的公司:运营驱动型;产品驱动型; 技术驱动型。

    Atitit  3种类型的公司:运营驱动型:产品驱动型: 技术驱动型. 领导驱动,产品驱动,运营驱动还是工程师驱动 3种类型的公司: 一种是运营驱动型: 一种是产品驱动型: 一种技术驱动型. 运营驱动 ...

随机推荐

  1. C#通过“委托和事件”的方式实现进程监控并与“普通方式”对比

    今天重新学习了一下观察者模式,对我的思路产生了启发.进程监控程序之前写过几个,这回换一种思路,改用委托和事件来实现.我已经用序号将关键的几步标注,方便大家理顺思路.代码如下: using System ...

  2. 进制转化之递归 && 栈

    将10进制转换成2进制,是除以2得到的余数,再倒序排列,这可以用递归实现,也可以用数据结构——栈实现. 先看递归实现: #include<stdio.h> void to_two(int ...

  3. Disable Maven Nature和disable workspace resolution

    1.Disable Maven Nature myeclipse更新maven的时候,手抖了一下,点上了Disable Maven Nature,然后工程右键菜单中的Maven栏就不见了! 其实这是把 ...

  4. 找你妹+ipad+wifi,回顾那年的经典游戏

    昨天,不是从前天同事拿平板给我后,就没睡过一个安稳觉. 先是看电视看得爽歪了,再就是昨天晚上的游戏之夜.IPAD比較老.连系统都不好更新了.就用了留存的应用. 打开酷我看看有什么音乐推荐,听到一首&l ...

  5. 【WPF】ListBox无法滚动

    问题:ListBox显示多个条目时,无法滚动,也不显示滚动条. 办法: 给ListBox控件加上ScrollViewer.VerticalScrollBarVisibility和ScrollViewe ...

  6. 正确配置Linux系统ulimit值的方法

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题:这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且L ...

  7. Linux下安装Redmine(项目管理软件)

    前置条件需要安装 ruby,rubygems,rake,rails和mysql数据库. 安装Redmine 和 Ruby.Rails对应的版本: Redmine version Supported R ...

  8. C++ 标准头文件与C头文件区别与联系以及C风格字符串

    1.cstdlib是C++里面的一个常用头文件, 等价于C中的<stdlib.h>. 2.一般一个带“.h” 扩展名的库文件,比如iostream.h.这是延续C语言的,为了兼容C.在新标 ...

  9. OC基础--常用类的初步介绍与简单实用之NSString

    一.NSString:不可变字符串/NSMutableString:可变字符串 1>字符串的常用创建方式: (1)NSString *s1 = @"Chaos"; (2)NS ...

  10. DataGridView使用技巧一:获取或设置当前单元格的内容

    当前单元格指的是DataGridView焦点所在的单元格,它可以通过DataGridView对象的CurrentCell属性取得.如果当前单元格不存在的时候,返回null. 取得当前单元格的内容: o ...