【发布时间】:2013-06-26 22:15:50
【问题描述】:
有人可以澄清我的错误解释吗?我知道我的理解是不正确的,因为我的代码产生了输出(见问题的底部)。 提前致谢。
为了澄清,下面一行的每个部分是什么意思?:
*(u8 *)((u32)BufferAddress + (u32)i)
它与以下行有何不同:
*(u32 *)((u32)BufferAddress + (u32)i)
我对上面的解释是:
- segment1 = ((u32)BufferAddress + (u32)i) => 将地址确定为整数。
- segment2 = (u32 *)(segment1) => 将地址转换为指针,其中指针长度为 32 位。
- segment3 = *(segment2) => 解引用指针以获得驻留在计算地址处的值。
我的解释有什么不正确的地方?我认为我缺乏理解是在segment2区域......铸造(u32 *)和(u8 *)有什么区别?
这是让我意识到我存在知识差距的代码:
初始化代码:
main(...) {
...
u8 *Buffer = malloc(256);
...
Buffer[0] = 1;
Buffer[1] = 0;
Buffer[2] = 0;
Buffer[3] = 4;
Buffer[4] = 0;
Buffer[5] = 0;
qFunction(... , Buffer, 6, ...);
...
}
qFunction(... , const u8 *BufferPointer, u32 BufferLength, ...) {
u32 BufferAddress;
...
BufferAddress = (u32) BufferPointer;
...
/* Method 1: */
for (i=0; i < BufferLength; i++)
printf("%d, %p\n", BufferPointer[i], &BufferPointer[i]);
/* Method 2: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u8 *)(BufferAddress+i), BufferAddress+i);
/* Method 3: */
for (i=0; i < BufferLength; i++)
printf("%d, 0x%lx\n", *(u32 *)(BufferAddress+i), BufferAddress+i);
...
}
方法一和方法二的输出和我预期的一样(都是一样的):
1, 0x1000000
0, 0x1000001
0, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
但是,方法 3 的输出对我来说似乎很奇怪;只有部分结果与方法1/2相同:
-1442840511, 0x1000000
11141120, 0x1000001
43520, 0x1000002
4, 0x1000003
0, 0x1000004
0, 0x1000005
如果有任何关于阅读材料的提示或参考,我将不胜感激。 谢谢。
【问题讨论】:
-
macduff 的回答是正确的,但要添加一条评论;您应该尽可能避免将指针转换为整数,因为这并不是真正必要的,并且如果您决定将来构建 64 位(指针将是 64 位,而不是 32 位),则会导致问题。