如何在C中读取地址上的字节?
我正在处理一些页表条目,并且有一个虚拟地址。每个页面上都有数据,虚拟地址映射到该页面 如果我有一个32位的虚拟地址,我如何“抓取”特定虚拟地址的第一个字节如何在C中读取地址上的字节?,c,memory,C,Memory,我正在处理一些页表条目,并且有一个虚拟地址。每个页面上都有数据,虚拟地址映射到该页面 如果我有一个32位的虚拟地址,我如何“抓取”特定虚拟地址的第一个字节 int *virtualAddress = someaddress; int byteAtAddress = *(virtualAddress); int secondByte = *(virtualAddress + 4); 显然,我得到的是4个字节,而不是1个字节。我可以在这里使用什么技巧来只获取一个字节?我不明白你为什么问这个问题,但
int *virtualAddress = someaddress;
int byteAtAddress = *(virtualAddress);
int secondByte = *(virtualAddress + 4);
显然,我得到的是4个字节,而不是1个字节。我可以在这里使用什么技巧来只获取一个字节?我不明白你为什么问这个问题,但显然这仍然是一个有效的问题。我说“我不明白”,因为你说“显然我得到了4个字节” 注意,指针算法考虑了指针类型,因此
*(virtualAddress+4)
is1实际上向基址添加了16个字节
事实上,这相当于
*((unsigned char *) virtualAddress + 4 * sizeof(*virtualAddress))
1假设您在常规系统上,其中
sizeof(int)==4
,这不一定是真的。C标准允许您将自己的内存地址强制转换为无符号字符*
:
unsigned char*p=(unsigned_char*)someaddress代码>
然后,您可以使用p
上的指针算法一次提取一个字节的内存。注意不要超出您拥有的内存范围-记住and int可以小到16位。您知道铸造吗?您可以尝试强制转换指针。char*virtualAddress=someaddress代码>就可以了。@Jean-Françoisfar:严格来说,无符号字符*。@Bathsheba你说得对,我刚刚修正了我的答案。“第一个字节”是什么?存储在最低地址的字节、整数的最低有效字节或整数的最高有效字节?答案是sizeof(int)=4
。该标准不保证这一点。它可以低至1
sizeof(int)
可以低至1
。这种方法不考虑尾数或编码。最好在原始int
上使用移位/掩码(更好的方法是:使用uint32\u t
)。
*((unsigned char *) virtualAddress + 4 * sizeof(*virtualAddress))