7

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

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

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

  2. 假设我有: int * ptr;

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

平台:我在 x86 上。

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

4

2 回答 2

12

在 C 中,指针不保证具有相同的大小。现在实际上大多数实现指针将具有相同的大小,但这是编译器的实现细节。

来自C 常见问题解答

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

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

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

于 2013-02-16T17:42:17.793 回答
1

从技术上讲,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,但是依赖给定的指针并没有什么好处尺寸

于 2013-02-16T17:42:09.610 回答