【问题标题】:C Programming- Malloc/FreeC 编程 - Malloc/免费
【发布时间】: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:是的,不必如此,但我认为这是一种很好的做法,而不是建议,尤其是对于新用户的多维数组。尽管它抽象了您引用的目的和真正原因,它完美地抽象了细节。

标签: c malloc free


【解决方案1】:

问题是你在freed 之后访问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);

【讨论】:

  • 嘿,有个问题。检查 malloc 失败是否常见?它几乎永远不会发生(除非你损坏了内存或实际上用完了它),我相信这会增加 if() 检查每个 malloc 的费用。
  • @Lefteris 同意,坦率地说,我很少检查它。我只是按照原帖的风格:)。但是,我认为这对于健壮的代码是必要的。
  • 哦,我没有注意到他在 OP 中也这样做了。很高兴看到你同意。好吧,这取决于您所说的健壮代码是什么意思。我的意思是,如果我要 if() 检查每个 malloc,我猜使用另一种语言会更好:P
  • @Lefteris: 不一定,你可以简单地将malloc 包装在一个错误退出的函数中,你仍然只会调用一个函数来分配内存,它只是有一个不同的名称.如果malloc 失败,您不应该继续 OP 的方式。
  • @AusCBloke 是的,当然你可以将它包装在一个函数中,甚至可以用它制作一个简洁的宏,但这是我想要说明的重点。您正在为每个 malloc 调用添加额外的函数调用开销。我想这完全取决于你想在哪里设置效率和更安全的编程之间的权衡。如果我收到更多失败的 malloc 调用,我可能一直在检查 malloc,但在我使用 malloc 工作的系统中,只有在我之前犯过编程错误和损坏的内存时才会失败。除了退出之外,您将如何处理实际程序中的 malloc 失败?
猜你喜欢
  • 2018-02-04
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2011-03-12
相关资源
最近更新 更多