C 语言指针数据隐藏难题:从原理困惑到巧妙解决

在编写C代码的过程中,指针是一个频繁出现且极为重要的元素,可以说是无处不在。实际上,我们还能对指针进行一些巧妙的额外运用,比如在指针里偷偷存储一些额外的信息。而实现这一巧妙技巧的关键,就在于巧妙利用内存中数据的自然对齐特性。

内存里的数据存储并非随意安排在任意地址上。处理器在读取内存时,总是按照与自身字长相同大小的块来进行读取。从提高效率的角度出发,编译器会将内存中的各种实体(如变量等)的地址,分配为它们自身大小(以字节为单位)的整数倍。举个例子,在32位处理器的环境下,一个占据4字节空间的整数类型数据,必然会被存储在能被4整除的内存地址之上。

在这里,我们先设定一个前提条件,假设在某个系统中,int类型(整数类型)所占用的空间大小,和指针类型所占用的空间大小,都是4字节。

接下来,让我们来深入思考一个指向int类型数据的指针。就像前面所提到的那样,int类型的数据有可能被存储在像0x10000x1004或者0x1008这样的内存地址位置,但绝对不会被存储在0x10010x10020x1003或者其他任何不能被4整除的内存地址上。

我们知道,在二进制表示中,任何一个能够被4整除的二进制数,其末尾的两位数字必然都是00

这也就意味着,对于任意一个指向int类型数据的指针而言,它所对应的内存地址值的二进制表示中,最右边的两个低阶位始终是零。

扫描二维码关注微信公众号,回复密码,即可获取密码

阅读剩余
THE END