2013-03-08 2007 views
14

大家好,我想用printf進行調試。但是我不知道如何打印「out」變量。在C中打印void *變量

在返回之前,我想打印這個值,但它的類型是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 2013-03-08 10:53:55

+1

你真的想打印指針本身的值嗎?考慮到代碼的作用,看起來你更想打印結果,即生成的字節。看到我的答案如何做到這一點。 :) – unwind 2013-03-08 10:58:43

回答

12

此:

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]); 

指針值本身很少是有趣的,但你可以printf("%p\n", out);打印。格式說明%p用於void *

+2

在你的'printf'行中'uint8 *'應該是'uint8_t'嗎? – MrPickles 2016-04-12 05:22:42

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

是打印(void*)指針的正確方法。

+2

如果要打印值而不是指針,請參閱unwind的答案。 – 2013-03-08 11:12:07

+0

我在void *中存儲了一個常量字符序列,並使用%p%它不打印字符串,而是看起來是字符串的地址 – Mushy 2017-09-26 19:46:06

6

C中使用printf來打印空指針的格式說明符是%p。通常打印的是指針的十六進制表示(儘管標準只是說它是一個定義指針的實現定義的字符序列)。

+0

從技術上講,它取決於實現選擇「打印什麼」,但除了一個簡單的十六進制數(除了有關AS/400的傳聞外),我從來沒有看到任何東西。 :-) – torek 2013-03-08 10:53:54

+0

@torek你說得對,標準說它是實現定義的。到目前爲止我看到的所有實現都決定使用十六進制,儘管:) – dasblinkenlight 2013-03-08 10:56:04

+0

@dasblinkenlight嗨,我在這裏有點晚,但希望問你:我從某處看過那個printf(「%p \ n」, PTR);應該是printf(「%p \ n」,(void *)ptr);否則我們會得到未定義的行爲,這是真的嗎?如果是這樣,爲什麼?提前致謝。 – Unheilig 2014-01-07 18:43:25