解除引用char *时奇怪的数组/指针行为

时间:2014-03-08 07:44:22

标签: c arrays pointers

我有这个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

2 个答案:

答案 0 :(得分:2)

请记住,指针算法会考虑数据类型的大小。由于buf的大小为64字节,&buf + 4是指向内存的指针4 * 64 = &buf之后的256字节。

获取指向buf[4]使用&buf[4]的指针。

答案 1 :(得分:1)

从您的示例中可以看出buf[4]buf[5]等相隔64个字节。

另一方面,最后一个命令($117)读取连续的字节。

尝试将所有内容都转换为纯char *并重做实验。