【问题标题】:Is size of char * same as size of int *?char * 的大小是否与 int * 的大小相同?
【发布时间】:2013-02-01 12:22:56
【问题描述】:

我知道: char * 是指向 char 的指针。 和 int * 是一个指向 int 的指针。

所以,我想确认以下两件事:

  1. 所以现在假设我在 32 位机器上,那么这意味着内存地址是 32 位宽的。 因此,这意味着 char * 和 int * 的大小都是 32 位(4 个字节),对吧? char * * 的大小是否也与 int * 的大小相同?

  2. 假设我有: int * ptr;

因此现在 *((char * *) ptr) = 0x154 与 *((int *) ptr) = 0x514 相同,对吧? ( 0x514 只是任何随机内存地址)

平台:我在 x86 上。

P.S.:我知道类型转换不是建议的编码方式。但是我正在做内核编码,因此我必须进行类型转换!

【问题讨论】:

  • 即使标准没有说出来,我怀疑要找到一个真正不同的环境会很容易。
  • 虽然它们的大小在实践中是相同的,但它们的对齐要求却不同。
  • 如果你在做“内核编码”,那已经限制了代码可以运行的平台数量。查看操作系统规范支持的内容。

标签: c pointers assembly dereference


【解决方案1】:

C 中的指针是not guaranteed to have the same size。现在实际上大多数实现指针的大小都相同,但这是编译器的实现细节。

来自C Faq

旧的 HP 3000 系列对字节使用不同的寻址方案 地址比字地址;像上面的几台机器 因此,它对 char * 和 void * 使用不同的表示形式 指针比其他指针

根据使用的“内存模型”,8086 系列处理器(PC 兼容)可以使用 16 位数据指针和 32 位函数 指针,反之亦然。

另外*((char *)ptr) = 0x154*((int *)ptr) = 0x154 不同。因为您要取消引用指针,所以您会将char 大小和int 大小的数据写入ptr 指向的位置。假设一个 8 位 char 和一个 32 位 int,*((char *)ptr) = 0x154 会将0x154 写入分配给ptr 的内存地址,*((int *)ptr) = 0x154 会将0x0000000154 写入从分配给ptr 的地址开始的 4 个字节.

【讨论】:

  • 简短的回答,但很好的链接。我建议将最有趣的句子内联到您的答案中,例如“旧的字寻址 Prime 机器也因需要比字指针 (int *'s) 更大的字节指针 (char *'s) 而臭名昭著。”
  • @user1599964 我认为这是一个错字,因为在您的示例中具有不同的值 - 转换为 char**int* 意味着非常不同的事情,不能直接比较。它们是不同级别的间接性,并且在做同样的事情时甚至不接近。
  • @user1599964 我已经考虑过这个更多的关闭,你的两个语句相当于sizeof(char*) == sizeof(int)。因此,具有 32 位指针和 32 位 int 的系统都将写入相同的位置。
【解决方案2】:

从技术上讲,C 标准只保证 sizeof(char) == 1,其余的取决于实现。但在现代 x86 架构(例如 Intel/AMD 芯片)上,这是相当可预测的。

您可能听说过将处理器描述为 16 位、32 位、64 位等。这通常意味着处理器使用 N 位来表示整数。由于指针存储内存地址,并且内存地址是整数,因此这有效地告诉您指针将使用多少位。 sizeof 通常以字节为单位,因此为 32 位处理器编译的代码将报告指针的大小为 4(32 位/每字节 8 位),而为 64 位处理器编译的代码将报告指针的大小为 8 (每字节 64 位 / 8 位)。这就是 32 位处理器的 4GB RAM 限制的来源——如果每个内存地址对应一个字节,则要寻址更多内存,您需要大于 32 位的整数。

实际上,在 16 位系统上,指针大小为 2(如果你能找到的话),在 32 位系统上为 4,在 64 位系统上为 8,但是依靠在给定尺寸上

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2020-05-29
  • 2017-06-01
  • 2013-09-08
  • 1970-01-01
  • 2012-10-12
  • 2020-09-08
相关资源
最近更新 更多