我正在做一个练习,需要打印指针的内存(地址)。这样做很容易printf("%p", ..)
但我不被允许使用它。
你知道我如何在不使用的情况下获得地址吗printf()
?
我唯一可以使用的功能是“写入”。
这是我的练习声明:
编写一个函数,它需要(const void *addr, size_t size)
,并显示
内存如示例所示。
您的函数必须声明如下:
void print_memory(const void *addr, size_t size);
$ cat main.c
void print_memory(const void *addr, size_t size);
int main(void)
{
int tab[10] = {0, 23, 150, 255,
12, 16, 21, 42};
print_memory(tab, sizeof(tab));
return (0);
}
$ gcc -Wall -Wall -Werror main.c print_memory.c && ./a.out | cat -e
0000 0000 1700 0000 9600 0000 ff00 0000 ................$
0c00 0000 1000 0000 1500 0000 2a00 0000 ............*...$
0000 0000 0000 0000 ........$
EDIT:在OP澄清他们实际上想要之前我提供了这个答案dump内存内容(在澄清之前,他们要求代码的行为类似于printf("%p", mem_ptr)
.
此代码应拼写出每个数字(以十六进制表示):
#include <stdint.h>
/* you must provide this function somewhere */
extern void write_char(char);
char hex_digit(int v) {
if (v >= 0 && v < 10)
return '0' + v;
else
return 'a' + v - 10; // <-- Here
}
void print_address_hex(void* p0) {
int i;
uintptr_t p = (uintptr_t)p0;
write_char('0'); write_char('x');
for(i = (sizeof(p) << 3) - 4; i>=0; i -= 4) {
write_char(hex_digit((p >> i) & 0xf));
}
}
Here, print_address_hex
是一次打印一个数字的基本算法(像这个)。 [为了简化我不关心前导零的事情]
算法的核心是算子>>
(类似于二进制整数除法)和&
(就像二进制余数一样)。 [请注意,这些运算符通常仅适用于基数 2、4、8、16、2^n]。
I used uintptr_t
使其便于携带。该类型 - 声明于<stdint.h>
- 指的是能够容纳指针的整型(与体系结构无关)。我们需要一个整型,以便我们可以使用算术运算符(除了+
and -
,指针算术的唯一有效运算符)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)