我正在做一个练习,我需要打印一个指针的内存(地址)。用 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 ........$
最佳答案
编辑: 在 OP 澄清他们实际上想要转储 内存内容之前,我提供了这个答案(在澄清之前,他们要求代码表现得像 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));
}
}
在这里,print_address_hex
是一次打印一个数字的基本算法 ( like this one )。 [为了简化我不关心前导零的事情]
算法的核心是运算符>>
(类似于二进制整数除法)和 &
(就像二进制余数一样)。 [请注意,这些运算符通常只适用于基数 2、4、8、16、2^n]。
我用了uintptr_t
使其便携。此类型 - 在 <stdint.h>
中声明- 指能够保存指针的整数类型(与体系结构无关)。我们需要一个整数类型,以便我们可以使用算术运算符(除了 +
和 -
,这是指针算术的唯一有效运算符)。
关于c - 如何在没有 printf 的情况下打印指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066271/