2010-11-22 18 views
1

leicht modifiziert werde ich die entsprechenden Zeilen kopieren:Segmentation Fault nach meinem Code

(Erklärungen)

typedef struct { /* per una entrada de la taula de posicion */ 
    int f; 
    int c; 
} pos; 
pos *p_opo[9]; 

(in Haupt)

for (i = 0; i < num; i++) { 
     p_opo[i] = (pos *) calloc(n_fil * n_col/2, sizeof (pos)); 
    } 

Jetzt, nach nur diese eingeführt zu haben Zeilen, bricht der Code an einem beliebigen Punkt (in einem Aufruf an eine bestimmte Bibliotheksfunktion). Ich vermute, ich verdirb etwas damit, obwohl ich nicht weiß was.

Alles, was ich will, ist ein Array von Arrays variabler Größe!

PD: num ist ein Argument des Programms. Ich habe es trotzdem mit num = 1 laufen lassen.

+0

Was ist 'num' ?? – EboMike

+0

Bearbeitete die Post. num ist ein Argument des Programms. Ich führe dies gerade mit num = 1 aus und erhalte den Fehler. – bluehallu

+0

Wenn num <= 9, sehe ich kein Problem mit dem, was Sie aufgeschrieben haben. Was meinst du mit "der Code bricht an einem beliebigen Punkt"? – steabert

Antwort

2

num sollte weniger oder gleich 9 sein (0..8 zugeordnet Zeiger in p_opo gleich 9!)

Beachten Sie, dass in C, die Sie Fehler an einem anderen Ort im Fall von Speicherlecks bekommen, usw. Der Grund dafür ist, dass durch Ändern eines Codes anderer Code oder andere Daten neu angeordnet werden können, was zu Segmentierungsfehlern führen kann.

So kann das Problem sehr gut in einem anderen Teil Ihres Programms sein. Stellen Sie sicher, dass Sie alle Warnungen aktiviert haben (wie die Option -Wall in gcc), damit Sie einige Hinweise erhalten.

+0

num = 1 für meine Tests. Genau das meine ich mit "Einbrechen eines beliebigen Punktes". Ich habe die Option -Wall bereits aktiviert. Keine Fehler oder Warnungen beim Kompilieren ... – bluehallu

+0

@Hallucynogenyc Führen Sie Ihr Programm von gdb. Wenn Sie einen Segmentierungsfehler erhalten, verwenden Sie den Befehl 'bt' (backtrace), um zu ermitteln, wo Fehler auftreten. – Roalt

+0

no gdb installiert, noch kann ich es installieren. Lesen Sie oben, um zu wissen, warum. – bluehallu

1

Wenn Ihr Anruf an calloc nach Speicher der Größe 0 fragt, kann es NULL zurückgeben, und wenn Sie diesen Speicher verwenden, kann es den Segmentierungsfehler verursachen. Also, wenn:

0 == (n_fil * n_col/2) 

oder irgendwie

0 == sizeof (pos)   /* I don't think that this is possible */ 

die Größe des Speichers, die Sie fordern 0, und so kann calloc NULL zurück.

Wenn dies nicht der Fall ist, dann glaube ich nicht, dass Sie dort genug Code haben, um zu wissen, warum es Segfaulting ist. Sie sollten beachten, dass solche Fehler unbemerkt bleiben können, bis Sie einen Code hinzufügen oder ändern, der völlig unabhängig von dem Code ist, der den tatsächlichen Fehler aufweist.

0

Wir sehen Sie Casting die Rückkehr von calloc macht mich verdächtig. Tun Sie das nicht, dies führt zu einem typischen Fehler, wenn Sie das Include für die Systemfunktion vergessen.

Dies passiert, wenn Sie auf einem Computer mit 64-Bit-Zeiger und 32 Bit int sind.

+0

versucht, den Cast zu entfernen. Derselbe Fehler :( – bluehallu

+0

@Hallucynogenyc: Sicher ohne die Besetzung haben Sie den gleichen Fehler. Die Idee ist, dass ohne sie jeder ordentliche Compiler sollte Ihnen eine offene Warnung geben. Ich nehme an, Sie kompilieren mit "-Wall" oder so ähnlich? Sie haben überhaupt keine Warnung von Ihrem Compiler? –

+0

das ist. Also kann ich sicher halten, die Besetzung, wo es war? – bluehallu