Drucken einer void*-Variablen in C

Lesezeit: 3 Minuten

Hallo zusammen, ich möchte ein Debugging mit printf machen. Aber ich weiß nicht, wie ich die Variable “out” drucken soll.

Vor der Rückkehr möchte ich diesen Wert drucken, aber sein Typ ist 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;
}

Wie kann ich? Vielen Dank.

  • Welche Art von Daten erwarten Sie out deuten auf?

    – Nick

    8. März 2013 um 10:53 Uhr

  • Möchten Sie wirklich den Zeigerwert selbst drucken? Wenn man bedenkt, was der Code tut, scheint es wahrscheinlicher, dass Sie das Ergebnis drucken möchten, dh die generierten Bytes. Siehe meine Antwort, wie das geht. 🙂

    – abschalten

    8. März 2013 um 10:58 Uhr

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

ist die richtige Art, a zu drucken (void*) Zeiger.

  • Wenn Sie den Wert anstelle des Zeigers drucken möchten, lesen Sie die Antwort von Unwind.

    – Graham Borland

    8. März 2013 um 11:12 Uhr

  • Ich habe eine konstante Zeichenfolge in einem void* gespeichert und mit %p% wird nicht die Zeichenfolge gedruckt, sondern die scheinbare Adresse der Zeichenfolge

    – Matschig

    26. September 2017 um 19:46 Uhr

Benutzer-Avatar
entspannen

Dies:

uint8_t *b = (uint8_t*) out;

impliziert, dass out ist in der Tat ein Hinweis auf uint8_t, also möchten Sie vielleicht die Daten drucken, die tatsächlich vorhanden sind. Beachten Sie auch, dass Sie nicht umwandeln müssen void * in C, also ist die Besetzung wirklich sinnlos.

Der Code scheint eine Hex-zu-Binär-Konvertierung durchzuführen und die Ergebnisse bei zu speichern out. Sie können die ausdrucken i generierte Bytes, indem Sie Folgendes tun:

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

Das Zeigerwert selbst ist selten interessant, aber man kann es mit drucken printf("%p\n", out);. Das %p Formatierungsbezeichner ist für void *.

  • Ist nicht uint8* soll sein uint8_t in deiner printf Linie?

    – MrPickles

    12. April 2016 um 5:22 Uhr

Der Formatbezeichner zum Drucken von void-Zeigern mit printf in C ist %p. Was normalerweise gedruckt wird, ist eine hexadezimale Darstellung des Zeigers (obwohl der Standard einfach sagt, dass es sich um eine implementierungsdefinierte Zeichenfolge handelt, die einen Zeiger definiert).

  • Technisch gesehen ist es Sache der Implementierung, zu wählen, “was gedruckt wird”, aber ich habe nie etwas anderes als eine einfache Hexadezimalzahl gesehen (trotz Gerüchten über AS/400s). 🙂

    – Torek

    8. März 2013 um 10:53 Uhr

  • @torek Du hast Recht, der Standard sagt, dass seine Implementierung definiert ist. Alle Implementierungen, die ich bisher gesehen habe, haben sich jedoch für die Verwendung von Hex entschieden 🙂

    – Sergej Kalinitschenko

    8. März 2013 um 10:56 Uhr

  • @dasblinkenlight Hallo, ich bin etwas spät hier, aber ich hatte gehofft, Sie fragen zu können: Ich habe irgendwo gesehen, dass printf(“%p\n”, ptr); sollte printf(“%p\n”, (void *) ptr); sonst würden wir undefiniertes Verhalten bekommen, ist es wahr? Wenn ja warum? Danke im Voraus.

    – Unheilig

    7. Januar 2014 um 18:43 Uhr

  • @Unheilig Ja, das stimmt, es sei denn ptr ist ein char*/unsigned char*die laut Standard die gleiche Darstellung wie haben müssen void*. Zeiger auf jeden anderen Typ können ein anderes Layout im Speicher haben (dies ist selten, kann aber vorkommen). Deshalb ist eine explizite Konvertierung erforderlich.

    – Sergej Kalinitschenko

    7. Januar 2014 um 18:48 Uhr

1344880cookie-checkDrucken einer void*-Variablen in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy