1

在 Turbo C 编译器中,使用 sizeof() 运算符时,int 指针的大小显示为 2 个字节。现在,如果我打印一个 int 变量的地址,它会是一个 8 位的十六进制数,这使得地址的大小为 32 位(或 4 个字节)。

那么,为什么 Turbo 编译器会显示 2 字节大小的指针?

4

5 回答 5

6

您的程序是在小内存模型下编译的,这意味着您的整个数据空间占用的空间不超过 64K。当程序启动时,DS 寄存器指向该数据空间,因此指针只需为 16 位即可引用数据空间中的任何位置。

在中型和大型内存模型中,数据空间可能大于 64K,并且您会发现指针是 32 位的。

请参阅 Alok 的评论。请参阅gcc进行替换。

于 2013-01-04T15:34:05.250 回答
3

我没有使用过 Turbo C,但我相信它是一个旧的 16 位 DOS/Windows 编译器。16 位程序有近和远指针。Near 指针为 2 个字节,只能指向当前段。远指针是一个 2 字节段和一个 2 字节偏移量,它们被移位并相加以提供 20 位寻址。

您看到的 8 位数字是添加到当前段的移位值的 2 字节指针。请参阅 x86 内存分段:http ://en.wikipedia.org/wiki/X86_memory_segmentation

于 2013-01-04T15:35:49.103 回答
2

真正的答案取决于您使用的是 Turbo C 中的哪个设置。指针可以是 16 位或 32 位,具体取决于它们是“近”还是“远”指针。远指针可以通过具有 16 位的段部分和 16 位的偏移部分来寻址那个时代(大约 20 多年前)的 PC 将拥有的 1MB 内存范围的“全部”。这些值组合为(segment << 4) + offset

有代码和数据空间的“模型”确定您是否获得数据和/或代码的近或远指针。

该页面描述了不同的模型: http : //www.tti.unipa.it/~ricrizzo/KS/Data/PBurden/chap6.msdos.memory.html(虽然它错误地指出地址可以达到256MB - 它应该是1MB ,当然,由于最后 64KB 是“BIOS”,而 A0000-EFFFF 之间的内存是“内存映射硬件”,实际上您最多只能使用 64KB [如果您“翻转”A20-gate,您可以使用1MB 以上的 64KB-16 字节作为 RAM,假设有 1MB 以上的 RAM])

当然,就像其他人所说的那样,停止使用在世界上大多数国家/地区获得驾驶执照的足够老的编译器。现在还有其他更好的产品(无论您对“更好”的定义是什么——除非“来自软盘”被定义为更好)。

于 2013-01-05T00:30:23.497 回答
2

您可能有一个 16 位版本的 Turbo C,这就是int该编译器的大小:http ://www.cs.technion.ac.il/~nikol/material/types_sizes.pdf

事实上,Turbo C 的所有版本显然都是 16 位的。

正如其他人已经建议的那样,为自己准备一个现代 C 编译器,例如gccor clang

于 2013-01-04T15:34:47.607 回答
0

曾经有一个计算机只在 DOS 上运行的时代。当时操作系统的启动是实模式启动。所以在实模式操作系统中,操作系统只能使用 1MB 的地址空间。turboc 实际上是为实模式制作的,所以它被称为 16 位。turboc 不知道您计算机的 RAM 是什么,或者处理器是 16 位、32 位还是 64 位。所以在 turboc 中,指针总是 2 bytes 。.但是如果您更改选项>>编译器>>模型下的设置并将其设置为巨大。然后它使用两个寄存器完全达到 1 MB 地址空间。2个字节,在这种情况下,指针可能是或将是4个字节

于 2013-03-26T12:23:29.297 回答