2012-04-09 2 views
2

So habe ich einen Code und wenn ich es ausführen, hängt es, wenn ich eine Größe größer als 3 eingeben. Wenn es genau 3 ist, läuft es reibungslos. Ich beschränke das Problem auf malloc und frei und ich weiß nicht, was das Problem ist. Ich bin neu darin, also wird jede Hilfe geschätzt.C Programmierung- Malloc/Free

do //repeatedly ask the user to put a number between 3-9 
{ 
printf("Enter the size of the game board between 3-9: "); 
scanf("%d", &size); 
}while(size<3 || size>9); 

if((board = (char***)malloc(sizeof(char**)*size))==NULL) 
    printf("Memory Allocation failed\n"); 
    for(i=0; i<size; i++) 
    { 
    if((board[i] = (char**)malloc(sizeof(char*)*size))==NULL) 
    printf("Memory Allocation failed\n"); 
    for(j=0; j<size; j++) 
    { 
     if((board[i][j] = (char *)malloc(sizeof(char)*4))==NULL) 
     printf("Memory Allocation failed\n"); 
     strcpy(board[i][j], "Go"); 
    } 
} 
/*************Some random code ***********/ 

free(board); 
for(i=0;i<size;i++) 
{ 
free(board[i]); 
for(j=0;j<size;j++) 
    free(board[i][j]); 
} 
+1

Die Reihenfolge der 'free()' in genau umgekehrter Reihenfolge 'malloc sein sollte()'. –

+0

Wenn Sie 'frei (board [i]) verwenden;' Sie verlieren tatsächlich den Zeiger auf den Speicher, den Sie zugewiesen haben, so dass Sie 'free (board [i] [j]);' nicht verwenden können. Benutze kostenlos (board [i]); nach dem zweiten für. –

+0

Okay, ich habe es Danke Jungs. – user1311135

Antwort

3

Das Problem ist, dass Sie, nachdem Sie boardfree d darauf zugreifen. Sie sollten Speicher in genau der umgekehrten Reihenfolge freigeben, die Sie malloc it.

Ein alternativer Ansatz ist, dass Sie den gesamten Speicher zuweisen können Sie in einer ganzen benötigen, wie

char ***board = NULL; 
char **rows = NULL; 
char *data = NULL; 

if((board = (char***)malloc(sizeof(char**)*size))==NULL) 
    printf("Memory Allocation failed\n"); 
if((rows = (char**)malloc(sizeof(char*)*size*size))==NULL) 
    printf("Memory Allocation failed\n"); 
if((data = (char *)malloc(sizeof(char)*size*size*4))==NULL) 
    printf("Memory Allocation failed\n"); 

for (i = 0; i < size; i++) { 
    int board_offset = i * size; 
    board[i] = rows[board_offset]; 
    for (j = 0; j < size; j++) { 
     int row_offset = board_offset + j; 
     rows[row_offset] = data[row_offset * 4]; 
     stcpy(data[row_offset * 4], "GO"); 
    } 
} 

free(board); 
free(rows); 
free(data); 
+0

hey, nur eine Frage. Ist es üblich, nach einem Ausfall von malloc zu suchen? Es passiert fast nie (es sei denn, Sie Speicher beschädigt oder tatsächlich aus ihm heraus), und ich glaube, es wird eine erhebliche Kosten hinzufügen, wenn() jeden malloc überprüfen. – Lefteris

+0

@Lefteris Stimme zu, und ich überprüfe es selten, um ehrlich zu sein. Ich folge nur dem Stil vom ursprünglichen Post :). Es ist jedoch notwendig für robusten Code, denke ich. –

+0

Oh, ich habe nicht bemerkt, dass er das auch im OP gemacht hat. Schön, dass Sie einverstanden sind. Nun, es hängt davon ab, was Sie mit robustem Code meinen. Ich meine, wenn ich war wenn() jedes Malloc überprüfen würde ich denke, dass eine andere Sprache wäre besser: P – Lefteris