我在微控制器上工作, 我想在执行代码后读取内存的内容。 我知道要读取的内存地址和大小 我尝试过这种方法:
const volatile unsigned char *const mem_start = 0xd0000000;
#define size ((ptrdiff_t)0x1c000)
unsigned char buff[size];
ptrdiff_t j;
for(j =0 ; j< sizeof(buff) ; j++)
buff[i]= *(mem_start + j);
我正在寻找另一种读取内存而不将其复制到缓冲区中的方法,该方法与我要读取的内存相同,可能会损坏我要查找的内容。并且由于空间不足,增益效果可能会重叠
答案 0 :(得分:4)
在声明中
...= *(mem_start + j);
您是正在读取内存。那你还想要什么?
顺便问一下,为什么不使用
mem_start[j]; ??
答案 1 :(得分:2)
您可以使用malloc()
或在堆栈上分配内存。两者之间没有重叠。如果源和目标之间确实存在重叠,则可以使用memmove()
;否则,memcpy()
就足够了。
答案 2 :(得分:0)
表达式:
*(mem_start + j)
或更传统的
mem_start[j]
是一种“读取”操作,例如在赋值的右侧或在函数调用中用作参数时。
因此,而不是您自己的代码行:
buff[j] = *(mem_start + j); // I'm assuming 'buff[i]' was a typo
从一个内存位置读取到另一个内存位置,您可以执行以下操作:
printf("%hhx", mem_start[j]);
将从偏移量{{1}的mem_start
读取字节,并将其作为字节值的十六进制表示形式输出到j
。将其放入一个循环中(就像您已经拥有的那样),您将有效地从内存中读取内容,而无需将 复制到第二个缓冲区中。
根据您的一些评论,我假设将内存内容显示在屏幕上会满足您的需求。根据您说的要显示的内存,我假设十六进制输出是合适的。但是还有其他选择,例如从源内存缓冲区读取文件或输出原始字节值(而不是这些值的表示形式)等。
请注意,尽管并非输入和输出的每种组合都有用。将原始字节值输出到终端屏幕可能会产生用处不大的结果,并且根据要对读取的数据进行的处理,用源字节的十六进制表示形式表示的文件也可能没有用。选择输出目的地和输出格式以适合您的需求。