2012-04-09 14 views
2

私はコードを持っています。実行すると、3より大きいサイズを入力するとハングします。正確に3になると、スムーズに実行されます。私は問題をmallocに自由に絞り込みました。問題の内容はわかりません。私はこれで新しいので、任意の助けに感謝しています。Cプログラミング-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

'無料()'(malloc関数 'の正確な順序を逆にする必要があります)'の順のように、あなたが全体に必要なすべてのメモリを割り当てることができるということです。 –

+0

「無料(board [i]);」を使用すると、割り当てられたメモリへのポインタが実際に失われるので、 'free(board [i] [j]);'は使用できません。自由(ボード[私])を使用してください。 2番目の後に。 –

+0

よろしくお願いします。 – user1311135

答えて

3

問題はあなたfree Dそれ後boardにアクセスしています。 mallocと逆の順序でメモリを解放する必要があります。

別のアプローチは、あなたが

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

ちょっと質問があります。 mallocの失敗をチェックするのは一般的ですか?メモリが壊れたり、実際にメモリが使い果たされたりしない限り、ほとんどの場合起こりません。すべてのmallocをif()にチェックするとかなりの費用がかかります。 – Lefteris

+0

@Lefteris同意し、私はめったにそれを率直にすることをチェックしない。私は元の投稿からスタイルをたどります:)。しかし、堅牢なコードのために必要です。 –

+0

ああ、私は彼があまりにもOPでそうしたことに気付かなかった。あなたに同意するのはニース。まあ、それは堅牢なコードの意味に依存します。私は他の言語を使うのが良いと思うすべてのmallocをチェックするのであればいいです:P – Lefteris