char *的大小是否与int *的大小相同?

时间:2013-02-16 17:36:56

标签: c pointers assembly dereference

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

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

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

  2. 假设我有: int * ptr;

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

    平台:我在x86上。

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

2 个答案:

答案 0 :(得分:12)

在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位字符和32位int,*((char *)ptr) = 0x154会将0x154写入分配给ptr的内存地址,而*((int *)ptr) = 0x154会将0x0000000154写入4 {从分配给ptr的地址开始的字节。

答案 1 :(得分: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,但在依赖中没有什么可以获得的在给定的大小