2016-06-09 15 views
-2

mein Programm schlägt immer in der 4. Realloc und ich verstehe nicht, warum es die 3 zuerst gut und dann scheitert es. Ich benutze Triple Pointer und ich habe versucht zu debuggen und alles funktioniert gut bis zum 4. Realloc, wenn es sagt, dass es außerhalb des Bereichs und Segmentierung Fehler ist.Fehler in mehreren Realloc C Pointer

#include <stdio.h> 
#include <stdlib.h> 

void rellenar(int ***movimiento, int mov, int discos) { 

    int j, pos, mov2, ***movimiento2; 
    mov2 = mov + 1; 

    movimiento = realloc(movimiento, mov2 * sizeof (int **)); 
    movimiento[mov] = malloc(3 * sizeof (int *)); //3 de torres 

    for (j = 0; j < 3; ++j) { 
     movimiento[mov][j] = malloc(discos); 
    } 
    printf("%d\n", mov); 
    for (pos = 0; pos < discos; pos++) { 
     movimiento[mov][0][pos] = 1; 
     movimiento[mov][1][pos] = 1; 
     movimiento[mov][2][pos] = 1; 
     printf("%d", movimiento[mov-1][0][pos]); 
     printf("%d", movimiento[mov-1][1][pos]); 
     printf("%d\n", movimiento[mov-1][2][pos]);   
    } 
} 

int main(int argc, char** argv) { 

    int ***movimiento, i, j, movs = 1, discos = 4, pos, mov; 
    movimiento = malloc(movs * sizeof (int **)); 
    for (i = 0; i < movs; ++i) { 
     movimiento[i] = malloc(3 * sizeof (int *)); //3 de torres 

     for (j = 0; j < 3; ++j) //3 de torres 
     { 
      movimiento[i][j] = malloc(discos); 

     } 
    } 

    for (pos = 0; pos < discos; pos++) { 
     movimiento[0][0][pos] = discos - pos; 
     movimiento[0][1][pos] = 0; 
     movimiento[0][2][pos] = 2; 
    } 
    for (pos = 0; pos < discos; pos++) { 
     printf("%d", movimiento[0][0][pos]); 
     printf("%d", movimiento[0][1][pos]); 
     printf("%d\n", movimiento[0][2][pos]); 
    } 


    for (mov = 1; mov < 6; mov++) { 
     rellenar(movimiento, mov, discos); 
    } 
} 

Was ist los?

+2

'movimiento [i] [j] = malloc (Diskotheken);' -> 'movimiento [i] [j ] = malloc (discos * sizeof (int)); '. Gleiches gilt für andere Orte, an denen Sie ähnliche "Mallocs" machen. – kaylum

+0

Noch besserer Hinweis: Wenn Sie auf einer unterstützten Plattform (z. B. Linux) arbeiten, führen Sie [valgrind] (http://valgrind.org) aus, damit Sie Speicherbeschädigungen wie diese leichter finden. Es wird Ihnen viel Zeit sparen. – kaylum

+0

Wie kaylum sagte, hast du vergessen, 'discos' mit' sizeof (int) 'zu multiplizieren, um die richtige Menge an Speicher für' movemiento [i] [j] 'zu reservieren. Infolgedessen schreiben Sie über den zugewiesenen Speicher hinaus und beschädigen Ihren Speicherstatus. Alle Wetten sind aus, sobald das passiert. –

Antwort

-1

Anstatt Triple-verschachtelten mallocs und reallocs, was ineffizient und schwer sind gerade zu halten, tun nur Ihre Zuordnung in einem einzigen Schuss:

size_t total = mov2 * 3 * discos; 
int* movimiento = malloc(total * sizeof(int)); 

Jetzt können Sie es wie folgt füllen:

for (size_t ii = 0; ii < total; ++ii) 
    movimiento[ii] = 1; 

dann eine Indizierungsfunktion machen:

int* get_cell(int* matrix, size_t x, size_t y, size_t z, size_t max_y, size_t max_z) { 
    return &matrix[x*max_y*max_z + y*max_z + z]; 
} 

Also:

int two = *get_cell(movimiento, mov, 1, pos, 3, discos); 

Und wenn es Zeit ist, den Speicher freizugeben, ist es einfach:

free(movimiento); 
+0

Das Problem ist, dass ich gebeten wurde, es mit realloc zu tun. Also irgendeine Idee von was funktioniert nicht in meinem Code? –