4

我有以下代码片段,

  char *chptr;
  int *numptr;

  printf("\nSize of char is %d\n",sizeof(chptr));
  printf("\nSize of int is %d\n",sizeof(numptr));

为此,我得到了以下输出,

Size of char is 4
Size of int is 4   

显然,指针最多可以存储2 32 - 1的地址。

我正在使用带有和的Windows 7 32-bit操作系统。Code::Blocks 10.05MingW

但是我的系统有一个Pentium Dual-Core带有36 Bit Address Bus. 目前我有 4 GB RAM。但是假设如果我增加 RAM 的大小来表示8 GBC 指针如何处理如此扩展的地址空间?C 指针的大小只有 32 位,但地址空间远远超过 2 32

有什么建议么?先感谢您。

PS:我已经检查了 此处给出的解决指针中地址存储的答案,但我相信它们并没有涵盖我的问题。

4

3 回答 3

4

您的指针将使用的地址位于虚拟地址空间中,而不是物理地址空间中(假设您使用的是现代操作系统;您没有在问题中说)。

O/S 内核将在必要时将虚拟内存页面映射到物理地址页面,并在用户进程不知道的情况下管理整个内存系统。

如果您使用的是 32 位操作系统,那么您可能需要 2GB 的用户地址空间来寻址,当您迁移到 64 位操作系统时,这将显着增加。

查看这篇关于虚拟内存的维基百科文章。

于 2013-04-23T12:25:51.667 回答
1

一些提示:

  1. 检查您的操作系统是 32 位还是 64 位。
  2. 检查您的编译器是否能够生成 64 位指针。
  3. 检查您的编译器是否有 64 位指针的其他数据类型。
  4. 检查您的编译器是否具有对 C 语言的扩展,例如关键字far__far
于 2013-04-23T12:32:57.047 回答
1

C 指针处理 8 GB 的最简单解决方案是再次分离代码和数据。然后,您将能够拥有 4 GB 的代码和 4 GB 的数据,因此总共 8 GB。无论如何,您不能合法地比较代码指针0x00010000和数据指针。0x00010000

但实际上,解决方案是迁移到 64 位。36 位 hack 没用;今天,128 GB 的 RAM 是完全可能的。

于 2013-04-23T12:50:07.100 回答