在C语言中打印void*变量

27

大家好,我想使用printf进行调试。但是我不知道如何打印“out”变量。

在返回之前,我想打印这个值,但它的类型是void*。

int 
hexstr2raw(char *in, void *out) {
    char c;
    uint32_t i = 0;
    uint8_t *b = (uint8_t*) out;
    while ((c = in[i]) != '\0') {
        uint8_t v;
        if (c >= '0' && c <= '9') {
            v = c - '0';
        } else if (c >= 'A' && c <= 'F') {
            v = 10 + c - 'A';
        } else if (c >= 'a' || c <= 'f') {
            v = 10 + c - 'a';
        } else {
            return -1;
        }
        if (i%2 == 0) {
            b[i/2] = (v << 4);
            printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);}
        else {
            b[i/2] |= v;
            printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);}
        i++;
    }
    printf("%s\n", out);
    return i;
}

我该怎么做?谢谢。


1
你期望 out 指向什么类型的数据? - Nick
2
你真的想打印指针值本身吗?考虑到代码的作用,更有可能是你想打印结果,即生成的字节。请参阅我的答案以了解如何实现。 :) - unwind
3个回答

63
printf("%p\n", out);

这是打印 (void*) 指针的正确方式。


7
如果你想打印数值而不是指针,请参考unwind的答案。 - Graham Borland
我在void*中存储了一个常量字符序列,并使用%p%,但它并没有打印字符串,而是似乎是字符串的地址。 - Mushy

25

这个:

uint8_t *b = (uint8_t*) out;

这句话意味着out实际上是一个指向uint8_t的指针,因此您可能希望打印实际存在的数据。另请注意,在C中不需要从void *进行类型转换,所以进行类型转换是没有意义的。
这段代码似乎是将十六进制转换为二进制,并将结果存储在out中。您可以通过执行以下操作打印生成的i个字节:
int j;
for(j = 0; j < i; ++j)
  printf("%02x\n", ((uint8_t*) out)[j]);
< p > 指针的值本身很少有意义,但您可以使用 < code > printf("%p\n", out); 打印它。 < code > %p 格式说明符是用于 < code > void * 的。 < / p >

2
你的 printf 行中,uint8* 不应该是 uint8_t 吗? - MrPickles

6
在C语言中,使用printf打印void指针的格式说明符是%p。通常打印的是指针的十六进制表示(尽管标准仅表示它是定义指针的实现定义字符序列)。请注意保留HTML标记。

从技术上讲,“打印什么内容”取决于实现,但我从未见过除了简单的十六进制数字之外的任何东西(尽管有关AS/400的传言)。 :-) - torek
@torek 你说得对,标准规定这是实现定义的。到目前为止,我见过的所有实现都决定使用十六进制 :) - Sergey Kalinichenko
1
@dasblinkenlight 你好,我来晚了,但是想问一下:我从某个地方看到过 printf("%p\n", ptr); 应该写成 printf("%p\n", (void *) ptr); 否则会得到未定义的行为,这是真的吗?如果是,为什么呢?提前感谢。 - Unheilig
1
@Unheilig 是的,这是真的,除非ptr是一个char */unsigned char *,这些指针按标准需要具有与void *相同的表示法。指向任何其他类型的指针在内存中可能具有不同的布局(这很少见,但可能会发生)。这就是为什么需要显式转换的原因。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接