因此,如果我正确理解了这个问题,您需要帮助理解这段代码
我假设你理解函数的前两行和最后一行,所以只剩下
ptr = (void *)(((int)ptr & (-1 << 4)) + 0x10);
首先我们应该看看(-1 << 4)
。既然你投了ptr
我相信假设 -1 也将被视为一个 int 并将成为值是安全的0xFFFFFFFF
(这将假设你的系统的 int 有 4 个字节或 32 位,我认为这是一个非常普遍的东西现在。接下来,既然有一个转变,我们应该看看这个的二进制表示,所以-1 = 0xFFFFFFFF = 0b11111111111111111111111111111111
如此移位 4 (-1 << 4) = 0b11111111111111111111111111110000 = 0xFFFFFFF0
...。
接下来ptr
是与这个值相加,这意味着ptr
将被强制以 结束0000
。请注意,使用这种格式转换任何类型的数字时,它都可以被 16 整除,从而ptr
将16
. 然后它添加0x10
以强制地址位于分配的区域内。
希望这可以帮助!
编辑:因为堆栈向下增长,分配给 ptr 的地址是什么?它是堆栈的底部还是堆栈的顶部?
假设base在较高的内存地址,top在较低的内存地址(因为向下增长)
正如评论中的人指出的那样:这种行为非常不确定。如果这是为了家庭作业,我怀疑是这样,我建议您验证这是您的机器的行为(并且可能是正在评分的机器)。否则要修复它,您可以简单地替换-1
为0xFFFFFFFF
,然后我相信问题应该得到解决(我再次没有咨询 c 标准,这只是从经验的角度来看)。请注意,用我解释的内容替换-1
应该0xFFFFFFFFu
仍然有意义。