【问题标题】:Printing a dynamic 2D array in C在 C 中打印动态二维数组
【发布时间】:2015-08-20 12:16:13
【问题描述】:

我正在尝试在 C 中打印 dynamic 2D array,问题是代码第一次打印得很好,但如果它再打印一次,它就会丢失底行。 这是我正在使用的代码:

void display_board( int height, int width, char** gameBoard ) {
   int i;
   char *rowString;
   rowString = malloc(((width*2)+1) * sizeof( char ));
   for( i = 0; i < ((height*2) + 1); i++ ){
      rowString = *(gameBoard + i);
      printf("%s\n",rowString);
   }
   free(rowString);
}

正在制作的游戏是点和框,因此宽度和高度是框的数量,数组实际上分配为height*2+1width*2+1,如果高度为2 和宽度为4,请注意该示例已经填充了所有边缘,但通常边缘只是空白:

x-x-x-x-x
| | | | |
x-x-x-x-x
| | | | |
x-x-x-x-x

当我第一次打印时它看起来像这样,但如果我再次尝试打印它看起来像这样:

x-x-x-x-x
| | | | |
x-x-x-x-x
| | | | |

知道为什么会这样吗?

【问题讨论】:

  • 这里根本不需要mallocfree,因为rowstring 将指向已经存在的内存。 malloc 用于获取新内存。
  • 我能问你为什么使用*(gameBoard + i)而不是语义上等效的gameBoard[i]吗?
  • 为什么不直接打印gameBoard
  • @Jess Ahrens 我想知道谁支持你的问题?!​​
  • 这是 no 二维数组!它是指向char 的指针的一维数组(可能是一维数组)。

标签: c arrays dynamic 2d


【解决方案1】:

在循环之前分配内存并将其分配给指针变量rowString。但是在循环中,您 重新分配 变量以指向其他地方,从而丢失了指向您分配的内存的原始指针。稍后,当您尝试释放内存时,您会释放“二维矩阵”中的内存,而不是刚刚分配的内存。

所有这些都会导致未定义的行为,因为您稍后会尝试取消引用之前释放的内存 (*(gameBoard + i))。

这里明显的解决方案是不重新分配指针,而是复制字符串,例如与strcpy。另一个非常明显的解决方案是根本不分配内存,甚至不使用 rowString 变量,因为您实际上并不需要它,但可以直接在 printf 调用中使用指针 *(gameBoard + i)

【讨论】:

  • 我显然是这方面的业余爱好者,摆脱了内存分配,只需将*(gameBoard + i) 打印出来就完美了,谢谢
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2022-12-04
  • 2011-07-07
  • 2014-12-21
相关资源
最近更新 更多