【发布时间】:2012-04-09 02:36:15
【问题描述】:
所以我有一个代码,当我运行它时,当我输入大于 3 的大小时它会挂起。当它正好是 3 时它运行顺利。我将问题缩小到 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]);
}
【问题讨论】:
-
free()的顺序应该与malloc()的顺序完全相反。 -
当你使用'free(board[i]);'你实际上丢失了指向你分配的内存的指针,所以你不能使用'free(board [i] [j]);'。使用免费(板[i]);在第二个之后。
-
好的,谢谢大家。
-
@Als:它不必是确切相反的顺序。如果您有一个包含 3 个指针的数组,您可以按 0、1、2 的顺序
malloc它们,然后以相同的顺序free它们。你不能在free指向之前的指针free。 -
@KeithThompson:是的,不必如此,但我认为这是一种很好的做法,而不是建议,尤其是对于新用户的多维数组。尽管它抽象了您引用的目的和真正原因,它完美地抽象了细节。