Frage

Ich möchte eine Variable vom Typ size_t in C drucken, aber es scheint, dass size_t auf unterschiedliche Variablentypen auf unterschiedlichen Architekturen aliased ist. Zum Beispiel auf einer Maschine (64-Bit) der folgende Code wirft keine Warnungen:

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

aber auf meiner anderen Maschine (32-Bit) der obige Code erzeugt die folgende Warnmeldung an:

  

Warnung: Format '% ld' erwartet Typ   'Long int *', aber Argument 3 hat Typ   'Size_t *'

I vermuten, dass dies auf die Differenz in Zeigergröße zurückzuführen ist, so dass auf meinem 64-Bit-Maschine mit einem size_t long int ("%ld") aliased ist, während auf meiner 32-Bit-Maschine auf einen anderen Typ size_t aliased ist.

Sie haben einen Formatbezeichner speziell für size_t?

War es hilfreich?

Lösung

Ja: Verwenden Sie die z Längenmodifizierer:

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 Länge Modifikatoren, die verfügbar sind hh (für char), h (für short), l (für long), ll (für long long), j (für intmax_t), t (für ptrdiff_t) und L ( für long double). Siehe §7.19.6.1 (7) des C99-Standard.

Andere Tipps

Ja, es gibt. Es ist %zu (wie in ANSI C99 angegeben).

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

Beachten Sie, dass size_t nicht signiert ist, so %ld ist doppelt falsch: falsche Längenmodifizierer und falsche Format Konvertierungsspezifizierer. Falls Sie sich fragen, ist %zd für ssize_t (die signiert).

MSDN , sagt, dass Visual Studio unterstützt das "I" Präfix für Code portable auf 32- und 64-Bit-Plattformen.

size_t size = 10;
printf("size is %Iu", size);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top