| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3692 人关注过本帖
标题:C语言数组大小的问题
只看楼主 加入收藏
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
TO:soft_wind

不客气。

象farcalloc,farmalloc这样的库函数只有在16位的编译器才支持,象TC。而32位的编译器已经没有支持这两种函数,象

far,near这样的关键字也没有支持。

far,near这样的关键字在DOS下才支持,在DOS下地址是分段的,每一段的长度为64K字节,所以刚好是16位。

near指针的长度是16位的,可指向的地址范围是64K字节。far指针的长度是32位,寻址范围是1M字节。

申请远堆和近堆的区别应该是远的工作速度慢了,我只知道far指针运算很反常,相信从远堆申请也差不多。

而且这里应该不是说从远堆可以申请到更大的内存。应该只是从哪个地方申请的差别而已。

关于这个我也只了解这么多,说错了勿怪勿怪。

我的原则很简单:不做不喜欢的事!
2006-08-08 20:53
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

呵呵,不管怎样,还是谢谢了.
我刚看到一篇不错的文章,好东西,转过来:

近程型(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,使用的是平面地址机制,没有近程型或远程型限制。


对不礼貌的女生收钱......
2006-08-08 21:15
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

自己加精了,我可没加自己魅力分哦,希望想了解它们差别都去看看,特别是 han2y?(没写错吧?


对不礼貌的女生收钱......
2006-08-08 21:22
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
yun.........

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-08-08 22:04
asdwmxj
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-1-5
收藏
得分:0 
各位大个,小弟有个问题请求大家解答一下
2010-01-05 16:12
快速回复:C语言数组大小的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016563 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved