我有这个64字节的字符数组buf
。
我试图将byte [4]的值取消引用为little-endian整数。但是当我逐个字符地看时,我得到的东西并不等同于字节。
请参阅下文,了解令我困惑的行为:
(gdb) p &buf + 4
$106 = (char (*)[64]) 0xbffff8c8
// These are the four bytes (little-endian)
(gdb) p/x buf[4]
$111 = 0x9a
(gdb) p/x buf[5]
$112 = 0xff
(gdb) p/x buf[6]
$113 = 0xff
(gdb) p/x buf[7]
$114 = 0xbf
//and here's buf[3] just for reference
(gdb) p/x buf[3]
$119 = 0xb
// Then why does dereferencing 0xbffff8c8 not yield 0xbfffff9a ??
(gdb) p/x *(0xbffff8c8)
$117 = 0xbffff8e4
答案 0 :(得分:2)
请记住,指针算法会考虑数据类型的大小。由于buf
的大小为64字节,&buf + 4
是指向内存的指针4 * 64 = &buf
之后的256字节。
获取指向buf[4]
使用&buf[4]
的指针。
答案 1 :(得分:1)
从您的示例中可以看出buf[4]
和buf[5]
等相隔64个字节。
另一方面,最后一个命令($117
)读取连续的字节。
尝试将所有内容都转换为纯char *并重做实验。