【问题标题】:Shouldn't an int pointer in Turbo C be of size 4 bytes?Turbo C 中的 int 指针不应该是 4 字节吗?
【发布时间】:2013-01-04 15:27:54
【问题描述】:

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

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

【问题讨论】:

  • 1.您不应该对指针的大小做出任何假设。 2.尽快摆脱turbo c编译器。
  • 我没有做任何假设,我认为我的理由是完美的。我目前使用的是Netbeans IDE,但是turbo c编译器中的这个疑问需要解决。
  • 当然你认为你的理由是完美的——事实并非如此
  • 问题没有错误,你必须尝试解决我的问题。我只是问了指针的大小。
  • 问题:如何打印出地址?我很确定 Turbo C 很高兴不知道 %p 转换。

标签: c pointers turbo-c


【解决方案1】:

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

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

请查看 Alok 的 cmets。如需更换,请参阅 gcc

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我有一个 16 位版本的 Turbo C,但上面给出的链接说明了 char、int、float 等的大小,而我说的是 char 指针、int 指针和浮动指针。请提供相应的链接。
      • 当我们说编译器是 16 位时,它基本上意味着它为指针长度为 16 位的计算机体系结构生成代码。就像在旧 PC 上运行的 DOS 中一样。
      【解决方案4】:

      真正的答案取决于您使用的是 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,假设 RAM 超过 1MB])

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          • 2018-08-25
          • 2014-02-18
          • 2014-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多