簡體   English   中英

在C中打印動態2D數組

[英]Printing a dynamic 2D array in C

我正在嘗試在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);
}

制作的游戲是點和盒子,因此width和height是盒子的數量,實際上將數組分配為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 但是在循環內部,您變量重新分配為指向其他位置,從而失去了指向已分配內存的原始指針。 稍后,當您嘗試釋放內存時,將釋放“ 2d矩陣”中的內存,而不是剛剛分配的內存。

所有這些都會導致不確定的行為 ,然后您隨后嘗試取消引用以前釋放的內存( *(gameBoard + i) )。

顯而易見的解決方案是不重新分配指針,而是復制字符串,例如使用strcpy 另一個很明顯的解決方案是根本不分配內存,甚至不使用rowString變量,因為您並不是真正需要它,而是可以在printf調用中直接使用指針*(gameBoard + i)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM