Seg Fehler beim Initialisieren des Arrays

7

Ich nehme eine Klasse mit C und stoße in einen Segmentierungsfehler. Soweit ich weiß, sollen seg-Fehler auftreten, wenn Sie auf Speicher zugreifen, der nicht zugeordnet wurde, oder anderweitig außerhalb der Grenzen. 'Alles, was ich versuche, ist ein Array zu initialisieren (obwohl es ziemlich groß ist)

Missverständnis ich einfach, wie man ein 2D-Array analysiert? Falsche Platzierung einer Grenze ist genau das, was einen Seg-Fehler verursachen würde - liege ich falsch darin, eine verschachtelte for-loop dafür zu verwenden?

Der Professor hat die Uhrfunktionen bereitgestellt, also hoffe ich, dass das nicht das Problem ist. Ich führe diesen Code in Cygwin, könnte das das Problem sein? Der Quellcode folgt. Mit c99 Standard auch.

Um ganz klar zu sein: Ich suche nach Hilfe, um den Grund zu verstehen, warum mein Code einen seg-Fehler erzeugt.

%Vor%     
Raven Dreamer 28.09.2010, 17:04
quelle

6 Antworten

9

Ihr Programm funktioniert auf meinem Computer (x86-64 / Linux) richtig, daher vermute ich, dass Sie eine systemspezifische Beschränkung der Anrufliste haben. Ich weiß nicht, wieviel Stapel Sie auf Cygwin bekommen, aber Ihr Array ist 4.000.000 Bytes (mit 32-Bit int ) - das könnte einfach zu groß sein.

Versuchen Sie, die Deklaration von majorArray von main zu verschieben (setzen Sie sie direkt nach #include s) - dann wird es eine globale Variable sein, die aus einem anderen Zuordnungspool stammt, der viel größer sein kann.

Übrigens ist dieser Vergleich rückwärts:

%Vor%

Um einen solchen Test durchzuführen, sollten Sie den Vorgang für viele verschiedene Array-Größen und -Formen wiederholen.

    
zwol 28.09.2010, 17:13
quelle
6

Sie versuchen, 1000 * 1000 * sizeof( int ) Bytes auf dem Stapel zu packen. Dies ist mehr, als Ihr Betriebssystem für das Stackwachstum zulässt. Wenn auf einem Unix - überprüfen Sie die ulimit -a für maximale Stapelgröße des Prozesses.

Als Faustregel gilt: Ordnen Sie große Strukturen auf dem Heap mit malloc(3) zu. Oder verwenden Sie statische Arrays - außerhalb des Bereichs einer Funktion.

In diesem Fall können Sie die Deklaration von majorArray durch ersetzen:

%Vor%     
Nikolai Fetissov 28.09.2010 17:12
quelle
3

Ich konnte keinen Fehler in Ihrem Code finden, also habe ich ihn kompiliert und ausgeführt und wie erwartet funktioniert.

Sie haben jedoch einen semantischen Fehler in Ihrem Code:

%Vor%

Sollte sein:

%Vor%

Außerdem sollte die Bedingung am Ende zu ihrer Umkehrung geändert werden:

%Vor%

Um das Problem der OS-spezifischen Stack-Größe zu vermeiden, sollten Sie Ihre Matrix außerhalb von main () definieren:

%Vor%     
Baltasarq 28.09.2010 17:14
quelle
1

Dieser Code läuft unter Linux gut für mich und ich kann nichts offensichtlich daran falsch sehen. Sie können versuchen, es über Gdb zu debuggen. Kompilieren Sie es wie folgt:

%Vor%

und dann sagen

%Vor%

und in gdb sagen run

Wenn es abstürzt, sagen Sie where und gdb, wo der Absturz aufgetreten ist. Dann siehst du jetzt in welcher Zeile der Fehler ist.

    
fschmitt 28.09.2010 17:12
quelle
1

Das Programm funktioniert perfekt, wenn es von gcc, & amp; Laufen Sie unter Linux, Cygwin könnte hier Ihr Problem sein.

    
user191776 28.09.2010 17:13
quelle
0

Wenn es anderswo korrekt ausgeführt wird, versuchen Sie höchstwahrscheinlich, mehr Stapelspeicher zu belegen, als das Betriebssystem zulässt. Sie ordnen 4 MB auf dem Stapel zu (1 Mill. Integer), was viel zu viel ist, um "sicher" auf dem Stapel zuzuweisen. malloc () und free () sind deine besten Wetten hier.

    
Maister 28.09.2010 17:18
quelle