在C中打印void*变量

sha*_*ait 18 c printf void-pointers uint

大家好我想用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;
}
Run Code Online (Sandbox Code Playgroud)

我能怎么做?谢谢.

Gra*_*and 49

printf("%p\n", out);
Run Code Online (Sandbox Code Playgroud)

是打印(void*)指针的正确方法.

  • 如果要打印值而不是指针,请参阅展开的答案. (3认同)

unw*_*ind 16

这个:

uint8_t *b = (uint8_t*) out;
Run Code Online (Sandbox Code Playgroud)

意味着它out实际上是一个指向uint8_t,所以也许你想要打印实际存在的数据.另请注意,您不需要void *在C中进行强制转换,因此演员阵容实在是毫无意义.

代码似乎是进行十六进制到二进制转换,将结果存储在out.您可以i执行以下操作来打印生成的字节:

int j;
for(j = 0; j < i; ++j)
  printf("%02x\n", ((uint8_t*) out)[j]);
Run Code Online (Sandbox Code Playgroud)

指针值本身很少是有趣的,但你可以用它打印printf("%p\n", out);.该%p格式说明符是void *.

  • `uint8*`应该是'printf`行中的`uint8_t`? (2认同)

das*_*ght 5

printf在C中使用打印void指针的格式说明符是%p.通常打印的是指针的十六进制表示(尽管标准简单地说它是定义指针​​的实现定义的字符序列).