2016-06-01 5 views
-6

zuerst benutze, sorry für mein schlechtes Englisch jeje. Ich spreche es nicht.C - Programm stürzt ab, wenn ich die kostenlose Funktion

ich ein Problem habe, wenn sie frei() Funktion, um Speicher frei verwenden, das ist, was ich habe:

Using free() function in C

Ich Codeblocks auf Windows 7. Ich habe ca. 3 Jahre using verwenden Dynamische Speicherzuweisung und das ist das erste Mal, dass ich dieses Problem bekomme. Es gibt Leute, die sagen, dass das Problem gcc-Compiler

equal Directions

Richtungen gleich sind und aus der Funktion, so dass ich glaube nicht, ich versuche, ein ungültiger Zeiger

+4

Veröffentlichen Sie Ihren Code nicht als Bild. Bitte poste deinen Code als Text direkt in deine Frage. Vergessen Sie bitte nicht, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu veröffentlichen. – MikeCAT

+3

Sie sagen [Sie sollten nicht das Ergebnis von 'malloc()' in C] werfen (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – MikeCAT

+0

Was ist die Frage? –

Antwort

0

Die frei in dem Codefehler ist:

  • M == NULL kein gültiger Weg ist zu prüfen, ob malloc gelungen ist. Sie sollten (*M) == NULL verwenden, da der Wert (*M), nicht M zugewiesen ist.
  • Der Loop-Zustand in ReservarMemoriaMatrizi<=m scheint falsch. Es sollte i<=n sein.
  • Sie haben vergessen, (*M)[n] in LiberarMemoriaMatriz freizugeben.

Corrected Code:

void LiberarMemoriaMatriz(double*** M,int n){ 
    int i = 0; 
    if(M == NULL) return; 
    for(i=0; i<=n; i++){ 
     free((*M)[i]); 
    } 
    free(*M); 
} 

int ReservarMemoriaMatriz(double*** M, int n, int ,){ 
    int i = 0; 
    if(M == NULL) return 0; 
    (*M) = malloc((n+1)*sizeof(double*)); 
    if((*M) == NULL){ 
     return 0; 
    } 
    for(i = 0; i<=n; i++){ 
     (*M)[i] = malloc(m*sizeof(double)); 
     if((*M)[i] == NULL){ 
      /* free what is allocated before failing */ 
      for(i--; i>=0; i--) free((*M)[i]); 
      free(*M); 
      return 0; 
     } 
    } 
    return 1; 
} 
+0

Die Zeilen 2-4 von ReservarMemoriaMatriz sind immer noch falsch. Vermutlich übergibt der Aufrufer '& M' als ersten Parameter, und das kann niemals NULL sein. Die zweite Zeile ist also bedeutungslos. Zeile 4 sollte * M für NULL, nicht M überprüfen. Und vorausgesetzt, der Anrufer gibt auch & M an LiberarMemoriaMatriz weiter, das gleiche gilt auch dort. – FredK

1

Ihre for-Schleife n nicht m auf Ihrer zweiten Runde der Zuteilung verwenden sollten.

for (i=0; i < n; i++) // You're using m here: use n 
{ 
    ... 
    malloc(m...) // Here m is correct 
0

Ich war auf der Suche line-by-line und fand schließlich den Fehler:

Ich mag, was Sie tun, das sagt:

frei, was, bevor ein Fehler zugeordnet ist

Eine andere Sache, die ich änderte, ist, wenn ich Speicher speichere, verwende ich:

(*M) = (double**)malloc(n * sizeof(double*)); 

und die Schleife Zustand, i < n, und alles funktioniert gut.