Warum verwenden wir sizeof mit malloc?[geschlossen]
-
23-12-2019 - |
Frage
Was ist der Zweck der Verwendung? sizeof
verwenden malloc
In C
?Warum ist es notwendig?
Ich meine, wir können es gebrauchen sizeof
Aber wir kennen bereits die Größe (= 1000 Bytes), die wir im Speicher zuweisen?
Ich bin Anfänger in C, also.Dies könnte eine sehr offensichtliche Frage sein.
Lösung
Datentypen und Speichermaterie
Die Antwort liegt in den Datentypen.Während Sie wissen wie viele Objekte Sie möchten Speicher reservieren, aber Sie möchten sich vielleicht nicht die Mühe machen, ihre Größe im Kopf zu berechnen.
Das Gleiche gilt für die Wartbarkeit
Und was passiert, wenn sich die Zusammensetzung dieser Stoffe später ändert?Dann bist du am Arsch und musst alles bearbeiten.
Das ist in Ihrem Beispiel also ohne Kontext irrelevant.Wenn Sie jedoch Speicher für komplexere Dinge reservieren möchten (z. B. eine Struktur mit mehreren Feldern), ist dies durchaus wichtig und nützlich.
Beispiel 1 (hier nicht so wichtig):
char *s = malloc(100 * sizeof(char));
Aber hey, es ist einfach so char
s, es ist in Ordnung, du hättest das tun können:
char *s = malloc(100);
Funktioniert grundsätzlich.Aber Sie schießen sich selbst ins Bein, wie Sie weiter unten sehen werden.
Beispiel 2 (ist schon ein bisschen wichtig):
int *i = malloc(100 * sizeof(int));
Klar hättest du das schreiben können:
int *i = malloc(100 * 4);
Das heißt, vorausgesetzt, Sie entwickeln nur für eine Architektur, die Sie ziemlich gut kennen.
Beispiel 3 (fängt an, ziemlich wichtig zu sein!):
typedef struct s_listelement{
int dataitem;
struct s_listelement *link;
} t_listelement;
t_listement *le = malloc(sizeof(t_listelement));
Stellen Sie sich nun vor, dass die Struktur des verknüpften Listenelements eine Reihe anderer Felder enthält ...
Möchten Sie vertrauen? sizeof()
, oder Spaß haben und selbst rechnen?
Andere Tipps
Angenommen, Sie möchten Speicher zum Speichern zuweisen int
S.Ihre erste Vermutung wird sein: Okay, das muss ich haben n
Ganzzahlen und jede Ganzzahl erfordert x
Bytes.So wird der Raum sein n*x
Bytes.
Aber eigentlich das x
hängt von der Architektur ab.Es kann 16 Bit, 32 Bit usw. sein.Damit Ihr Code in verschiedenen Umgebungen funktioniert, wird die Verwendung empfohlen n*sizeof(int)
anstatt n*x
.
Wenn Sie beispielsweise Platz für 10 ganze Zahlen reservieren müssen:
int *p=malloc(sizeof(int)*10);
Was passiert, wenn Sie die Größe ändern? mallocated
?
Sie müssen 1) die neue Größe erneut berechnen (von Problemen mit mehreren Zielarchitekturen abgesehen, bei denen Sie die neue Größe in jedem Ziel berechnen müssen), 2) nach allen suchen malloc(1000)
, stellen Sie sicher, dass es sich darauf bezieht mallocated
(was möglicherweise nicht offensichtlich ist) und durch eine neue Größe ersetzen.
Sie haben keines dieser beiden Probleme bei der Verwendung sizeof
.So verwenden sizeof
führt zu einem besser wartbaren und lesbaren Code.