Malloc oder normale array-definition?
Wann werde ich dann benutzen Sie malloc-anstelle der normalen array-definition in C?
Kann ich nicht verstehen den Unterschied zwischen:
int a[3]={1,2,3}
int array[sizeof(a)/sizeof(int)]
und:
array=(int *)malloc(sizeof(int)*sizeof(a));
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie im Allgemeinen
malloc()
wenn:Verwenden Sie andernfalls einen stack reservierten Arrays.
Wenn als lokale Variablen, die beide
a
undarray
wäre auf dem Stapel reserviert. Stack Allokation hat seine vor-und Nachteile:In beiden Fällen ist die Anzahl der Elemente in den beiden arrays ist eine compile-Zeit-Konstante:
3
ist offensichtlich eine Konstante, währendsizeof(a)/sizeof(int)
berechnet werden kann zur compile-Zeit, da sowohl die Größe dera
und die Größe derint
sind zu der Zeit bekannt, wennarray
deklariert ist.Wenn die Anzahl der Elemente bekannt ist, nur bei der Laufzeit oder, wenn die array-Größe ist zu groß, um sicher zu passen in Platz auf dem stack, dann heap-Zuweisung verwendet wird:
Wie bereits erwähnt, sollte dies
malloc(sizeof(a))
da die Größe dera
ist bereits die Anzahl der bytes, die es braucht, und nicht die Anzahl der Elemente und damit zusätzliche Multiplikation mitsizeof(int)
ist nicht notwendig.Heap allocaiton und-Freigabe ist eine relativ teure operation ist (im Vergleich zu stack-Allokation), und diese sollten sorgfältig gewichteten gegen die Vorteile, die es bietet, z.B. in code, der aufgerufen wird, Vielzahl von Zeiten in engen loops.
Moderne C-Compiler unterstützen den C99-version der C-standard stellt die so genannte variable-length arrays (oder VLAs), die ähneln, ähnliche Funktionen in anderen Sprachen verfügbar. VLA ist eine Größe angegeben ist, zur Laufzeit, wie in diesem Fall:
array
ist immer noch auf dem Stapel reserviert als wenn der Speicher für das array reserviert wurde durch einen Aufruf vonalloca(3)
.Du auf jeden Fall noch verwenden malloc() wenn Sie nicht möchten, dass Ihre Arrays eine Feste Größe haben. Je nachdem, was Sie versuchen zu tun, könnte man nicht im Voraus wissen, wie viel Speicherplatz Sie gehen zu müssen, für eine bestimmte Aufgabe oder müssen Sie möglicherweise dynamisch ändern Sie die Größe des array zur Laufzeit, zum Beispiel könnten Sie es zu vergrößern, wenn mehr Daten ankommen. Letzteres kann mit realloc() ohne Datenverlust.
Anstatt "initialisieren" ein array wie in deinem ursprünglichen post sollten Sie nur initialisieren Sie einen Zeiger auf integer wie.
Dein code ist sehr seltsam.
Die Antwort auf die Frage im Titel ist wahrscheinlich so etwas wie "verwenden Sie die automatisch zugeordneten arrays, wenn Sie Sie brauchen sehr kleine Mengen von Daten, die kurzlebig sind, heap-Zuweisungen mit
malloc()
für etwas anderes". Aber es ist schwer zu festzunageln eine genaue Antwort, es hängt viel von der situation.Nicht sicher, warum Sie sind, zeigen erste ein array, dann ein weiteres array, das versucht, zu berechnen, deren Länge von der ersten, und schließlich ein
malloc()
nennen, die versucht, das gleiche.Normalerweise haben Sie eine Vorstellung von der Anzahl der gewünschten Elemente, sondern als ein vorhandenes array, dessen Größe, die Sie wollen, zu imitieren.
In der zweiten Zeile ist besser als:
Keine Notwendigkeit zu wiederholen, die eine Abhängigkeit der Art der
a
, die oben definierenarray
als ein array vonint
mit der gleichen Anzahl von Elementen als arraya
. Beachten Sie, dass dies nur funktioniert, wenna
ist ja ein array.Auch, die Dritte Zeile sollte wohl sein:
Keine Notwendigkeit, zu klug (vor allem, da du hast es falsch) über die
sizeof
argument, und keine Notwendigkeit zu werfenmalloc()
's return Wert.