[英]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+1
和width*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.