Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中读取地址上的字节?_C_Memory - Fatal编程技术网

如何在C中读取地址上的字节?

如何在C中读取地址上的字节?,c,memory,C,Memory,我正在处理一些页表条目,并且有一个虚拟地址。每个页面上都有数据,虚拟地址映射到该页面 如果我有一个32位的虚拟地址,我如何“抓取”特定虚拟地址的第一个字节 int *virtualAddress = someaddress; int byteAtAddress = *(virtualAddress); int secondByte = *(virtualAddress + 4); 显然,我得到的是4个字节,而不是1个字节。我可以在这里使用什么技巧来只获取一个字节?我不明白你为什么问这个问题,但

我正在处理一些页表条目,并且有一个虚拟地址。每个页面上都有数据,虚拟地址映射到该页面

如果我有一个32位的虚拟地址,我如何“抓取”特定虚拟地址的第一个字节

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))