web-dev-qa-db-fra.com

Impression d'une variable void * en C

Salut tout ce que je veux faire un débogage avec printf. Mais je ne sais pas comment imprimer la variable "out".

Avant le retour, je souhaite imprimer cette valeur, mais son type est nul *.

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;
}

Comment puis-je faire? Merci.

18
sharkbait

Cette:

uint8_t *b = (uint8_t*) out;

implique que out est en fait un pointeur vers uint8_t, donc vous voudrez peut-être imprimer les données qui sont réellement là. Notez également que vous n'avez pas besoin de lancer à partir de void * En C, donc la distribution est vraiment inutile.

Le code semble faire une conversion hexadécimale en binaire, stockant les résultats dans out. Vous pouvez imprimer les i octets générés en faisant:

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

Le valeur du pointeur lui-même est rarement intéressant, mais vous pouvez l'imprimer avec printf("%p\n", out);. Le spécificateur de formatage %p Est pour void *.

17
unwind
printf("%p\n", out);

est la bonne façon d'imprimer un (void*) pointeur.

47
Graham Borland

Le spécificateur de format pour l'impression de pointeurs vides à l'aide de printf en C est %p. Ce qui est généralement imprimé est une représentation hexadécimale du pointeur (bien que la norme dise simplement qu'il s'agit d'une séquence de caractères définie par l'implémentation définissant un pointeur).

5
dasblinkenlight