Plattformunabhängige size_t Formatbezeichner in c?

Lesezeit: 4 Minuten

Benutzeravatar von Ethan Heilman
Ethan Heilmann

Ich möchte eine Variable vom Typ ausdrucken size_t in C, aber es scheint, dass size_t wird auf verschiedenen Architekturen mit verschiedenen Variablentypen aliased. Beispielsweise löst der folgende Code auf einem Computer (64-Bit) keine Warnungen aus:

size_t size = 1;
printf("the size is %ld", size);

aber auf meinem anderen Computer (32-Bit) erzeugt der obige Code die folgende Warnmeldung:

Warnung: Format ‘%ld’ erwartet den Typ ‘long int *’, aber Argument 3 hat den Typ ‘size_t *’

Ich vermute, dass dies auf den Unterschied in der Zeigergröße zurückzuführen ist, also auf meinem 64-Bit-Computer size_t ist ein Alias ​​für a long int ("%ld"), während auf meinem 32-Bit-Rechner size_t ist einem anderen Typ zugeordnet.

Gibt es einen speziellen Formatbezeichner für size_t?

  • Ihre Warnmeldung stimmt nicht mit dem Code überein. Die Warnung erwähnt Zeiger, Ihr Code hat keine. Hast du welche entfernt & irgendwo?

    – Jens

    17. April 2012 um 14:38 Uhr

  • Hinweise? Nein, ich erhalte keine Warnungen zu Zeigern, je nachdem, auf welchem ​​Computer ich diesen Code ausführe, erhalte ich manchmal überhaupt keine Warnungen. Versuchen Sie den folgenden Testcode: #include int main(){ size_t size = 1; printf(“Die Größe ist %ld”, Größe); 0 zurückgeben; }

    – Ethan Heilmann

    17. April 2012 um 16:39 Uhr

  • Siehe auch Plattformübergreifende Formatzeichenfolge für Variablen vom Typ size_t?.

    – legoscia

    21. September 2012 um 10:10 Uhr

  • @EthanHeilman Er bezieht sich auf die Tatsache, dass Ihre Warnungen sagen warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *' wenn es wahrscheinlich sollte sagen warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'. Hast du vielleicht benutzt scanf() stattdessen, wenn Sie diese Warnungen erhalten haben?

    – RastaJedi

    20. August 2016 um 19:04 Uhr

  • Mögliches Duplikat von Was ist der richtige Weg, um printf zu verwenden, um ein size_t zu drucken?

    – phuklv

    6. Mai 2017 um 9:13 Uhr

Benutzeravatar von Adam Rosenfield
Adam Rosenfeld

Ja: Verwenden Sie die z Längenmodifikator:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

Die anderen verfügbaren Längenmodifikatoren sind hh (zum char), h (zum short), l (zum long), ll (zum long long), j (zum intmax_t), t (zum ptrdiff_t), und L (zum long double). Siehe §7.19.6.1 (7) des C99-Standards.

  • was ist der unterschied zwischen zd und zu? Ich verstehe, dass zd dezimal ist, aber ist es signiert, wenn ja, wie wirkt sich zd signiert aus?

    – Ethan Heilmann

    24. Januar 2010 um 3:51 Uhr

  • Es ist der Unterschied zwischen a size_t und ein ssize_t; Letzteres wird selten verwendet.

    – Adam Rosenfield

    24. Januar 2010 um 3:53 Uhr

  • Richtig, also sollten Sie in diesem Fall verwenden %zuda das Argument vorzeichenlos ist.

    – Café

    24. Januar 2010 um 23:03 Uhr

  • Die anderen verfügbaren Optionen werden in der printf-Manpage erklärt: linux.die.net/man/3/printf

    – EINS

    7. Januar 2014 um 22:00 Uhr

  • @detly: Nein, die z Längenmodifikator ist nicht Teil von C89/C90. Wenn Sie auf C89-kompatiblen Code abzielen, können Sie am besten in umwandeln unsigned long und benutze die l Längenmodifikator stattdessen, zB printf("the size is %lu\n", (unsigned long)size);; unterstützt sowohl C89 als auch Systeme mit size_t größer als long ist kniffliger und würde die Verwendung einer Reihe von Präprozessor-Makros erfordern.

    – Adam Rosenfield

    25. März 2014 um 6:01 Uhr

Ja da ist. es ist %zu (wie in ANSI C99 angegeben).

size_t size = 1;
printf("the size is %zu", size);

Beachten Sie, dass size_t ist also unsigniert %ld ist doppelt falsch: falscher Längenmodifikator und falscher Formatkonvertierungsbezeichner. Falls Sie sich fragen, %zd ist für ssize_t (was signiert ist).

MSDNsagt, dass Visual Studio das Präfix „I“ für Code unterstützt, der auf 32- und 64-Bit-Plattformen portierbar ist.

size_t size = 10;
printf("size is %Iu", size);

  • Es ist MS-spezifisch, was nicht standardkonform ist, also nicht plattformunabhängig

    – phuklv

    24. Juni 2016 um 7:24 Uhr

  • @phuclv In der Tat. Und wenn es wirklich heißt – wie die Antwort nahelegt – „tragbar“, ist es noch schlimmer, als ich jemals über MS wusste. Nicht, dass es mich überraschen würde … Ich bin keiner, der ablehnt, weil sich jemand die Mühe gemacht hat, etwas zu beantworten, aber diese Antwort ist einfach falsch. Ah, ich glaube, ich verstehe die Idee hier in “tragbar”. Es muss gesagt werden, dass es sowohl für 32-Bit als auch für 64-Bit funktioniert. Aber natürlich würde es.

    – Pryftan

    3. Dezember 2019 um 15:00 Uhr

1421210cookie-checkPlattformunabhängige size_t Formatbezeichner in c?

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

Privacy policy