2013-02-16 46 views
7

我知道: char *是一个指向char的指针。 和 int *是一个指向int的指针。char *的大小与int *的大小相同吗?

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

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

  2. 假设我有: int * ptr;

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

平台:我在x86上。

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

+0

即使标准没有说出来,我怀疑它会很容易找到一个实际上不同的环境。 – Mysticial 2013-02-16 17:40:12

+0

尽管它们的尺寸在实践中相同,但它们的对齐要求不是。 – DCoder 2013-02-16 17:41:19

+0

如果您正在执行“内核编码”,那已经限制了代码可以运行的平台数量。检查OS规范支持的内容。 – 2013-02-16 22:01:36

回答

11

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

C Faq

旧的HP 3000系列采用了不同的寻址方案为字节比字地址 地址;像上述若干 机器因此它使用了字符*不同的表现,比其他指针

取决于所使用的``内存模式'无效* 指针,8086系列处理器(PC 兼容机)可能使用16位数据指针和32位函数指针,反之亦然。

另外*((char *)ptr) = 0x154*((int *)ptr) = 0x154不一样。因为您取消了指针的引用,所以将数据写入char的大小和int的大小到ptr指向的位置。假设一个8位字符和一个32位int,*((char *)ptr) = 0x154将把0x154写入分配给ptr的存储器地址,并且*((int *)ptr) = 0x1540x0000000154写入从分配给ptr的地址开始的4个字节。

+0

简短的回答,但很好的链接。我会建议在你的答案中插入最有趣的句子,例如“旧的,字寻址的Prime机器因需要比字指针(int *'s)更大的字节指针(char *'s)而臭名昭着。” – 2013-02-16 17:43:58

+0

@ shf301 :我将它编辑为*((char **)ptr)= 0x154。 – user1599964 2013-02-16 17:53:57

+0

@ user1599964我认为这是一个拼写错误,因为在你的例子中有不同的值 - 铸造成一个char **或一个int *意味着非常不同的东西,并且不能直接比较。他们是不同层面的间接性,甚至不会做同样的事情。 – shf301 2013-02-16 17:58:37

1

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

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

实际上,指针在16位系统(如果可以找到一个)上的大小为2,在32位系统上为4,而在64位系统上为8,但没有什么可以获得的依靠给定的尺寸

+0

在没有遇到[标准委员会也考虑过]的36或48位体系结构的情况下,这一切都很顺利(http://stackoverflow.com/questions/6971886/exotic-architectures-the-standard-committee-cares-about )。 – 2013-02-16 21:56:13

相关问题