c - 在 C 中打印动态二维数组

标签 c arrays dynamic 2d

我正在尝试在 C 中打印一个动态二维数组,问题是使用代码它第一次打印很好,但如果它再次打印多次,它会丢失底行。 这是我正在使用的代码:

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
| | | | |

知道为什么会这样吗?

最佳答案

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

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

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

关于c - 在 C 中打印动态二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32118043/

相关文章:

java - 如何打印二维数组的结果

mysql - MySQL 中的自动增长 ENUM

c - C 中带有 malloc 和 realloc 的动态字符串数组不会退出循环

c - 测量一组指令的准确时间(周期数)

C - 字符串数组 realloc() 内存错误

fork()的执行顺序可以确定吗?

javascript - 如何相交两个数组并保留 key

c++ - 将无符号字符数组转换为整数

css - WordPress 仅在前端加载动态 css

创建n个随机点并创建四边形(卡住)C