首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中打印void*变量

在C中打印void*变量
EN

Stack Overflow用户
提问于 2013-03-08 18:49:56
回答 3查看 93.5K关注 0票数 22

大家好,我想用printf做一个调试。但我不知道如何打印"out“变量。

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

代码语言:javascript
运行
复制
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;
}

我该怎么做呢?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-08 18:54:27

这一点:

代码语言:javascript
运行
复制
uint8_t *b = (uint8_t*) out;

这意味着out实际上是指向uint8_t的指针,因此您可能希望打印实际存在的数据。还请注意,您不需要在C中从void *进行强制转换,因此强制转换实际上是没有意义的。

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

代码语言:javascript
运行
复制
int j;
for(j = 0; j < i; ++j)
  printf("%02x\n", ((uint8_t*) out)[j]);

指针值本身很少有意义,但您可以用printf("%p\n", out);打印它。%p格式说明符是用于void *的。

票数 22
EN

Stack Overflow用户

发布于 2013-03-08 18:51:12

代码语言:javascript
运行
复制
printf("%p\n", out);

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

票数 57
EN

Stack Overflow用户

发布于 2013-03-08 18:51:26

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15292237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档