我在 Turbo C 编译器和 GNU 编译器上运行了以下代码:
int main()
{
char *cptr;
printf("%d\n",sizeof(cptr));
return 0;
}
我在 Turbo C 运行时输出了“ 2 ”,在 GNU 编译器运行时输出了“ 4 ”。我在 64 位机器上。谁能向我解释这种差异背后的事实?
老式的 Turbo C 可能是为 16 位 DOS 机器构建的,默认情况下它具有小指针。
如果我们考虑基于 DOS 的 Turbo-C 编译器,地址被限制在 0x0000 到 0xFFFF (0-65535) 的范围内,因此指针的大小为 2 个字节。另一方面,如果我们考虑 32 位 GNU 编译器,那里会创建数百万个地址,因此大小为 4 个字节。
指针的大小仅取决于您使用的 C 编译器,而不取决于操作系统。
Turbo C 是 16 位的,所以sizeof(cptr)
.
仅仅因为您的机器本身是 64 位的,并不意味着您可以在其上运行的每一位软件都会利用它。64 位机器(和支持软件)被设计为向上兼容 32 位。因此,为 32 位机器编写的软件能够运行。
对于任何给定的指针类型,不同的平台可能具有不同的大小。这一切都取决于底层内存架构和任何给定进程可用的地址空间。永远不要假设指针类型总是有一个特定的大小。
基本上,指针的大小是指针使用的整数类型的大小。准确地说,32 位平台上的 32 位 int,64 位平台上的 64 位 int(long long)。但要小心,它还取决于您使用的编译器。这意味着,即使在 64 位平台上,如果您使用 32 位编译器(甚至 16 位),指针类型仍将使用 32 位 int。从你的结果看,你的 Turbo C 编译器肯定不是 64 位的(应该是 16 位的,如果我没记错的话)。虽然您的 gcc 编译器是真正的 64 位。