在 Turbo C 编译器中,使用 sizeof() 运算符时,int 指针的大小显示为 2 个字节。现在,如果我打印一个 int 变量的地址,它会是一个 8 位的十六进制数,这使得地址的大小为 32 位(或 4 个字节)。
那么,为什么 Turbo 编译器会显示 2 字节大小的指针?
您的程序是在小内存模型下编译的,这意味着您的整个数据空间占用的空间不超过 64K。当程序启动时,DS 寄存器指向该数据空间,因此指针只需为 16 位即可引用数据空间中的任何位置。
在中型和大型内存模型中,数据空间可能大于 64K,并且您会发现指针是 32 位的。
请参阅 Alok 的评论。请参阅gcc进行替换。
我没有使用过 Turbo C,但我相信它是一个旧的 16 位 DOS/Windows 编译器。16 位程序有近和远指针。Near 指针为 2 个字节,只能指向当前段。远指针是一个 2 字节段和一个 2 字节偏移量,它们被移位并相加以提供 20 位寻址。
您看到的 8 位数字是添加到当前段的移位值的 2 字节指针。请参阅 x86 内存分段:http ://en.wikipedia.org/wiki/X86_memory_segmentation
真正的答案取决于您使用的是 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])
当然,就像其他人所说的那样,停止使用在世界上大多数国家/地区获得驾驶执照的足够老的编译器。现在还有其他更好的产品(无论您对“更好”的定义是什么——除非“来自软盘”被定义为更好)。
您可能有一个 16 位版本的 Turbo C,这就是int
该编译器的大小:http ://www.cs.technion.ac.il/~nikol/material/types_sizes.pdf
事实上,Turbo C 的所有版本显然都是 16 位的。
正如其他人已经建议的那样,为自己准备一个现代 C 编译器,例如gcc
or clang
。
曾经有一个计算机只在 DOS 上运行的时代。当时操作系统的启动是实模式启动。所以在实模式操作系统中,操作系统只能使用 1MB 的地址空间。turboc 实际上是为实模式制作的,所以它被称为 16 位。turboc 不知道您计算机的 RAM 是什么,或者处理器是 16 位、32 位还是 64 位。所以在 turboc 中,指针总是 2 bytes 。.但是如果您更改选项>>编译器>>模型下的设置并将其设置为巨大。然后它使用两个寄存器完全达到 1 MB 地址空间。2个字节,在这种情况下,指针可能是或将是4个字节