Heute half ich einem Freund von mir mit einigen C-Code, und ich habe ein seltsames Verhalten gefunden, dass ich ihm nicht erklären konnte, warum es geschah. Wir hatten TSV-Datei mit einer Liste von ganzen Zahlen, mit einem int jeder Zeile. Die erste Zeile war die Anzahl der Zeilen, die die Liste hatte.Unterschied zwischen Array-Typ und Array mit Malloc zugeordnet
Wir hatten auch eine c-Datei mit einer sehr einfachen "readfile". Die erste Zeile n gelesen wurde, die Anzahl der Zeilen, dann gab es eine Initialisierung von:
int list[n]
und schließlich ein für die Schleife von n mit einem fscanf.
Für kleine n (bis ~ 100.000) war alles in Ordnung. Wir haben jedoch herausgefunden, dass, wenn n groß ist (10^6), ein Segfault auftreten würde.
Schließlich haben wir die Liste der Initialisierung
int *list = malloc(n*sizeof(int))
und alles, wenn sie gut, auch bei sehr großen n.
Kann jemand erklären, warum das passiert ist? Was verursachte den segfault mit int list [n], der gestoppt wurde, als wir list = malloc (n * sizeof (int)) verwendeten?
Sehr aufschlussreiche Antwort ... danke! –
Große Antwort! Ich frage mich, ob es auch einen Geschwindigkeitsunterschied gibt? –
Aufgrund der Auswirkungen der Lokalität der Referenz würde ich vermuten, dass das Array mit dem zugewiesenen Stack schneller zugänglich ist, und "Malloc" selbst ist viel langsamer als nur einen Stack-Pointer zu stoßen. Aber am besten ist es, den Ansatz zu verwenden, der für die jeweilige Aufgabe geeigneter ist. – templatetypedef