c - 如何在没有 printf 的情况下打印指针地址

标签 c arrays pointers printf

我正在做一个练习,我需要打印一个指针的内存(地址)。用 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/

相关文章:

c - 为什么 strtok() 使我的程序返回负值?

java - 将数据读入数组时出现空异常

c - C中链表实现的设计

c++ - 两次连续的套接字读取,第二次读取不起作用

c - 如何从一行接受一定量的输入

Javascript 将方法分配给数组值

pointers - 为什么带有指针和非指针接收器的方法在 Go 中不能具有相同的名称?

c++ - 线程: I want to pass a struct pointer in main to a function called by pthread

C - 指向指针的指针问题,似乎看不到

c++ - 将 C++ 变量从类传递给 C 函数