2012-04-09 92 views
2

所以我有一個代碼,當我運行它時,它會掛起,當我輸入一個大於3的大小。當它正好3它運行平穩。我將問題縮小到malloc和free,我不知道問題是什麼。我是新來的,所以任何幫助表示讚賞。C編程 - Malloc /免費

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')完全相反的順序('順序。 – 2012-04-09 02:38:43

+0

當你使用'free(board [i]);'你實際上失去了指向你分配的內存的指針,所以你不能使用'free(board [i] [j]);'。免費使用(board [i]);在第二次之後。 – 2012-04-09 02:41:09

+0

好的,謝謝你們。 – user1311135 2012-04-09 02:43:57

回答

3

問題是你後,你free d它訪問board。你應該按照與你相反的順序釋放內存。

另一種方法是,你可以分配你的整體需要的記憶,就像

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失敗是否很常見?它幾乎從不發生(除非你損壞內存或實際用完它),我相信它會增加if()檢查每個malloc的相當大的開銷。 – Lefteris 2012-04-09 03:19:32

+0

@Lefteris同意,我很少檢查它是坦率的。我只是按照從原來的帖子:)的風格。然而,我認爲這對於健壯的代碼是必要的。 – 2012-04-09 03:44:43

+0

哦,我沒有注意到他在OP中也是這麼做的。很高興看到你同意。那麼這取決於你的代碼是什麼。我的意思是,如果我想if()檢查每個malloc,我想用另一種語言會更好:P – Lefteris 2012-04-09 03:47:11