814 Stimmen

Was ist size_t in C?

Ich bin verwirrt mit size_t in C. Ich weiß, dass es von der sizeof Betreiber. Aber was genau ist er? Ist es ein Datentyp?

Nehmen wir an, ich habe eine for Schleife:

for(i = 0; i < some_size; i++)

Soll ich die int i; o size_t i; ?

4voto

Prince Punkte 51

Size_t ist ein ganzzahliger Datentyp ohne Vorzeichen. Auf Systemen, die die GNU C Library verwenden, ist dies unsigned int oder unsigned long int. size_t wird üblicherweise für Array-Indizierung und Schleifenzählung verwendet.

3voto

Mark Punkte 1104

Im Allgemeinen sollten Sie, wenn Sie bei 0 beginnen und nach oben gehen, immer einen vorzeichenlosen Typ verwenden, um einen Überlauf zu vermeiden, der Sie in eine negative Wertesituation bringt. Dies ist sehr wichtig, denn wenn die Grenzen Ihres Arrays kleiner sind als der Maximalwert Ihrer Schleife, aber der Maximalwert Ihrer Schleife größer ist als der Maximalwert Ihres Typs, werden Sie einen negativen Überlauf haben und es kann zu einem Segmentierungsfehler (SIGSEGV). Verwenden Sie also im Allgemeinen niemals int für eine Schleife, die bei 0 beginnt und nach oben geht. Verwenden Sie einen unsigned.

3voto

Artem Punkte 324

Dies ist eine plattformspezifische typedef . Auf einer bestimmten Maschine könnte es zum Beispiel sein unsigned int o unsigned long . Sie sollten diese Definition verwenden, um Ihren Code besser portieren zu können.

2voto

bishwas pokharel Punkte 140

größe_t oder ein vorzeichenloser Typ kann als Schleifenvariable verwendet werden, da Schleifenvariablen normalerweise größer oder gleich 0 sind.

Wenn wir eine größe_t Objekts müssen wir sicherstellen, dass in allen Kontexten, in denen es verwendet wird, einschließlich der Arithmetik, nur nicht-negative Werte gewünscht werden. Zum Beispiel würde das folgende Programm definitiv das unerwartete Ergebnis liefern:

// C program to demonstrate that size_t or
// any unsigned int type should be used 
// carefully when used in a loop

#include<stdio.h>
int main()
{
const size_t N = 10;
int a[N];

// This is fine
for (size_t n = 0; n < N; ++n)
a[n] = n;

// But reverse cycles are tricky for unsigned 
// types as can lead to infinite loop
for (size_t n = N-1; n >= 0; --n)
printf("%d ", a[n]);
}

Output
Infinite loop and then segmentation fault

-4voto

David Zechiel Punkte 35

Nach meinem Verständnis, size_t ist eine unsigned Ganzzahl, deren Bitgröße groß genug ist, um einen Zeiger der nativen Architektur aufzunehmen.

Also:

sizeof(size_t) >= sizeof(void*)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X