23

こんにちは、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;
}

どのようにできるのか?ありがとう。

4

3 に答える 3

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

(void*)ポインタを印刷する正しい方法です。

于 2013-03-08T10:51:11.543 に答える
22

これ:

uint8_t *b = (uint8_t*) out;

outは実際には へのポインターであることを意味するuint8_tため、実際にそこにあるデータを出力したい場合があります。また、C からキャストする必要がないことにも注意してくださいvoid *。したがって、キャストは本当に無意味です。

コードは 16 進数から 2 進数への変換を行っているようで、結果を に格納していますouti次のようにして、生成されたバイトを出力できます。

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

ポインター値自体はめったに興味深いものではありませんが、で表示できますprintf("%p\n", out);%p書式指定子はvoid *.

于 2013-03-08T10:54:26.813 に答える
6

printfCで使用してvoidポインタを出力するためのフォーマット指定子はです%p。通常印刷されるのは、ポインターの16進表現です(ただし、標準では、ポインターを定義する実装定義の文字シーケンスであると単純に述べられています)。

于 2013-03-08T10:51:25.913 に答える