-1

我在 Turbo C 编译器和 GNU 编译器上运行了以下代码:

int main()
{
   char *cptr;
   printf("%d\n",sizeof(cptr));
   return 0;
}

我在 Turbo C 运行时输出了“ 2 ”,在 GNU 编译器运行时输出了“ 4 ”。我在 64 位机器上。谁能向我解释这种差异背后的事实?

4

6 回答 6

3

老式的 Turbo C 可能是为 16 位 DOS 机器构建的,默认情况下它具有小指针。

于 2012-05-31T14:28:33.450 回答
2

如果我们考虑基于 DOS 的 Turbo-C 编译器,地址被限制在 0x0000 到 0xFFFF (0-65535) 的范围内,因此指针的大小为 2 个字节。另一方面,如果我们考虑 32 位 GNU 编译器,那里会创建数百万个地址,因此大小为 4 个字节。

指针的大小仅取决于您使用的 C 编译器,而不取决于操作系统。

于 2012-10-12T18:50:58.153 回答
1

Turbo C 是 16 位的,所以sizeof(cptr).

于 2012-05-31T14:28:40.853 回答
1

仅仅因为您的机器本身是 64 位的,并不意味着您可以在其上运行的每一位软件都会利用它。64 位机器(和支持软件)被设计为向上兼容 32 位。因此,为 32 位机器编写的软件能够运行。

于 2012-05-31T14:30:45.213 回答
0

对于任何给定的指针类型,不同的平台可能具有不同的大小。这一切都取决于底层内存架构和任何给定进程可用的地址空间。永远不要假设指针类型总是有一个特定的大小。

于 2012-05-31T14:52:01.570 回答
0

基本上,指针的大小是指针使用的整数类型的大小。准确地说,32 位平台上的 32 位 int,64 位平台上的 64 位 int(long long)。但要小心,它还取决于您使用的编译器。这意味着,即使在 64 位平台上,如果您使用 32 位编译器(甚至 16 位),指针类型仍将使用 32 位 int。从你的结果看,你的 Turbo C 编译器肯定不是 64 位的(应该是 16 位的,如果我没记错的话)。虽然您的 gcc 编译器是真正的 64 位。

于 2012-05-31T14:35:30.820 回答