Segmentierungsfehler wegen Speichermangel in C

7

Dieser Code gibt mir Segmentierungsfehler etwa die Hälfte der Zeit:

%Vor%

Ich muss eigentlich ein viel größeres Array zuweisen, gibt es eine Möglichkeit, dem Betriebssystem zu erlauben, mehr Speicher zu bekommen?

Ich benutze Linux Ubuntu 9.10

    
Tom 19.11.2010, 00:05
quelle

4 Antworten

22

Sie haben die standardmäßige maximale Stapelgröße von 8 MB überschritten.

Sie können entweder die Stapelgröße erhöhen - z. für 32 MB:

%Vor%

... oder Sie können zur Zuweisung mit malloc wechseln:

%Vor%     
caf 19.11.2010 00:08
quelle
6

Im Moment werden Sie 2619560*sizeof(float) bytes auf dem Stack zuweisen (oder zumindest versuchen). Zumindest in den meisten typischen Fällen kann der Stapel nur eine begrenzte Menge an Speicher verwenden. Sie könnten versuchen, stattdessen static zu definieren:

%Vor%

Dadurch wird es aus dem Stapel entfernt, so dass es normalerweise stattdessen verfügbaren Speicher verwenden kann. In anderen Funktionen ändert die Definition von static die Semantik, aber im Fall von main macht es wenig Unterschied (anders als die meist theoretische Möglichkeit eines rekursiven main ).

    
Jerry Coffin 19.11.2010 00:09
quelle
1

Legen Sie kein so großes Objekt auf den Stapel. Erwägen Sie stattdessen, es im Heap zu speichern, indem Sie es mit malloc () oder seinen Freunden teilen.

2.6M floats ist nicht so viele, und sogar auf einem 32-Bit-System sollten Sie für Adressraum in Ordnung sein.

Wenn Sie ein sehr großes Array zuweisen müssen, verwenden Sie unbedingt ein 64-Bit-System (vorausgesetzt, Sie haben genug Speicher!). 32-Bit-Systeme können nur ungefähr 3G pro Prozess adressieren, und selbst dann können Sie nicht alles als einen einzigen zusammenhängenden Block zuweisen.

    
MarkR 19.11.2010 15:33
quelle
0

Es ist der Stapel Overflower. Sie sollten besser die malloc-Funktion verwenden, um Speicher größer als die Stapelgröße zu erhalten, die Sie von "ulimit -s" erhalten können.

    
Tony 19.11.2010 05:19
quelle