2017-07-22 3 views
1

Wenn ich die folgende Variable unsigned long long int *size habe, ist es eine gute Praxis, size = calloc(2, sizeof(int)) zu verlassen oder es sollte size = calloc(2, sizeof(unsigned long long int)) sein?Verwendung von unsigned long long int für die dynamische Zuweisung

Vielen Dank

+0

Nun, sind "int" und "unsigned long long int" gleich groß auf Ihrer Plattform? –

+3

Bessere Praxis, 'size = Calloc (2, sizeof * size);' für weniger Fehler und mehr wartbaren Code zu verwenden. –

+0

@DavidBowling Gute Idee. Vielen Dank – Kris

Antwort

2

Zweite Option. Sie möchten keine Annahmen über die Datentypgrößen in c treffen.
Es ist sehr Plattform/Compiler abhängig.

2

Es gibt keinen Grund anzunehmen, dass int und unsigned long long int die gleiche Größe haben (sie können sein). Wenn size als unsigned long long int deklariert wird, dann die beiden Optionen vorgestellt, die richtige Wahl ist:

size = calloc(2, sizeof(unsigned long long int)); 

Eine bessere Praxis zu vermeiden, ist explizite Typen mit sizeof mit:

size = calloc(2, sizeof *size); 

Dies ist weniger fehler- anfällig in der anfänglichen Codierung und wartbarer. Wenn sich Typen während der Laufzeit des Codes ändern, muss hier nur die Deklaration geändert werden.

+0

Ist dies auch ein gültiges Argument für andere Datentypen? Zum Beispiel 'double * length = calloc (2, sizeof * length);' – Kris

+1

@ Medoo-- yes. Dies ist ein gängiges C-Idiom. Beachten Sie, dass das Argument in den meisten Fällen nicht ausgewertet wird. Selbst wenn "Größe" nicht initialisiert ist, ist dies OK. Das heißt, 'sizeof * size;' deserfiziert nicht die Größe des Zeigers; es bestimmt nur die Größe des Arguments vom Typ. –

+0

Nur gelehnt dies. Vielen Dank. Will es von jetzt an verwenden :) – Kris

0

Die Größe von int kann entweder 2 oder 4 Byte sein, abhängig von der Maschine, die Sie ausführen.
Die Größe von unsigned long long beträgt jedoch mindestens 8 Byte.

Also nein, es ist NICHT eine gute Praxis, eine Worng Größe zu verwenden.

+1

Ein 'int' muss mindestens 16 Bit breit sein, aber es gibt keine Obergrenze im Standard. –

Verwandte Themen