我有兴趣访问我已经分配的内存部分以更好地理解事物,假设我使用malloc
分配10个字节而printf("%p", &foo)
返回0xff0a
,我会不会能够分配0xff0a->0xff1a
(我的十六进制数学目前是不好的)并访问任何一个单独的字节?
我想我记得使用关键字volatile
以及内存地址,我不知道该代码能够做什么但是...
我想我的意思是我如何访问内存中的随机字节,转换为char或整数,我可以存储在指针中以便以后访问。
答案 0 :(得分:4)
我假设您要从多字节类型(如int或short)访问单个字节。常见的习惯用法是将地址转换为char *和deference,如下所示:
#include <stdio.h>
int main(void)
{
int foo = 0xDEADBEEF;
int i;
for (i = 0; i < 4; i++) {
printf("byte %d of foo is x%02X\n", i, *((unsigned char*)&foo + i));
}
return 0;
}
$ ./a.out
byte 0 of foo is xEF
byte 1 of foo is xBE
byte 2 of foo is xAD
byte 3 of foo is xDE
注意 它向后看的原因是x86是小端
答案 1 :(得分:3)
printf("%p", &foo)
打印指针变量foo
的地址,不 foo
中包含的地址(来自malloc
的地址})。你真的想要:
printf("%p", (void *)foo);
如果您希望访问foo
指向的内存中的10个字节,您只需使用:
char *p = foo;
然后通过p[0]
访问p[9]
。
答案 2 :(得分:0)
如果您从0xff0a
分配10个字节,则地址范围为:0xff0a
到0xFF14
。
volatile
强制编译器每次都抓取该位置的存储值。这用于硬件编程和多线程应用程序。
此示例将int x的地址存储到指针p:
中int x = 5;
int * p = &x; //assign address of (operator &) x into a pointer
printf("%d\n", *p); // will display 5
答案 3 :(得分:0)
您可能希望使用联合以始终应用相同的代码串来循环变量的字节区域。成员'byte'将始终指向与其他成员相同的地址。您可以将其包含在结构中,以便与联合保持大小。最后,你只需调用一个函数来打印或检查一堆内存的内容......
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
union byteMap {
char* addressString;
void* addressInt;
unsigned char* byte;
};
struct structByteMap {
size_t size;
union byteMap map;
};
int main (int argc, char* argv[]) {
struct structByteMap map;
if (argc > 1) {
int temp = strtoimax(argv[1], NULL, 10);
map.map.addressInt = &temp;
map.size = sizeof(int);
} else {
map.map.addressString = "HELLO, YES HELLO";
map.size = strlen(map.map.addressString);
}
for (int i = 0; i < map.size; i++) {
printf("byte %d of param is x%02X\n", i, *(map.map.byte + i));
}
}