2016-11-30 3 views
-6

Ich arbeitete an der Erstellung eines dynamischen Arrays auf der Grundlage einer Eingabedatei und wurde ein segmentation Fehler Fehler ohne nützliche Informationen mit gdc geworfen. Während des Debugging habe ich versucht zu überprüfen, ob Ntot korrekt gelesen wurde und irgendwie hat das den Fehler behoben. Wenn ich den Cout entferne (wie im Beispiel), dann kommt der Fehler zurück, hat jemand einen Einblick warum?Segmentierungsfehler (Core Dumped), wenn ich keinen Cout einschließe?

#include <iostream> 
#include <math.h> 
#include <fstream> 
#include <stdlib.h> 

using namespace std; 

int main(){ 

double **number; 

int i, Ntot; 

ifstream input("initial_parameters.dat"); 

input >> Ntot; 

//cout<<Ntot<<endl; 
//uncomenting this removes the error 

number = (double**)malloc(sizeof(double*) * (5)); 
for (int i = 1; i <= 5; i++) 
    number[i] = (double*)malloc(sizeof(double) * (Ntot)); 

    number[1][1] = 1.; 
    cout<<number[1][1]<<endl; 
    number[2][1] = 2.; 
    cout<<number[2][1]<<endl; 
    number[3][1] = 3.; 
    cout<<number[3][1]<<endl; 
    number[4][1] = 4.; 
    cout<<number[4][1]<<endl; 
    number[5][1] = 5.; 
    cout<<number[5][1]<<endl; 

return 0; 

} 

Edit: Initialisierung Array arbeitet, ist:

double** number = new double*[5]; 
for (int i = 0; i < 5; i++) 
    number[i] = new double[Ntot]; 
+6

Warum, oh * warum * verwenden Sie 'malloc' in C++ ? – UnholySheep

+7

Sie haben ein nicht definiertes Verhalten, weil Sie in den zugewiesenen Speicher außerhalb der Grenzen schreiben. Indizes gehen in C++ von "0" nach "Größe - 1". –

+4

Das erste Element des Arrays befindet sich im Index 0. Der Zugriff auf 'number [5]' verursacht undefiniertes Verhalten. –

Antwort

1

Starten Zuteilen Speicher 0 aus dem Index, da die Indizierung in C/C++ von 0 ab, und 1 nicht

for (int i = 0; i < 5; i++) 

Auch , ersetzen Sie i durch i - 1 in allen number[i][j] oben. Wie number[1][1] = 1. von number[0][1] = 1. und so weiter.

Und auch, nicht verwenden malloc (und sie geben Guss sein Ergebnis auch nicht!), Verwenden Sie stattdessen new:

number[i] = new double[Ntot]; 
+0

Ich habe versucht mit Malloc als Alternative nach keine Ergebnisse mit neuen, der ursprüngliche Code meine größere Arbeit basiert auf ist in C so ein paar Dinge hier und da muss repariert werden. Bei den von Ihnen vorgeschlagenen Änderungen habe ich erneut einen Segmentierungsfehler erhalten. –

+0

Ich nehme an, dass Ihr Problem gelöst ist, bitte markieren Sie die Antwort als akzeptiert. @A.Dakroury – Jarvis

Verwandte Themen