在 C 中打印动态二维数组
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);
}
正在制作的游戏是点和方块,所以宽度和高度是方块的数量,数组实际上分配为 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
。但是在循环中,您 重新分配 变量以指向其他地方,从而丢失了指向您分配的内存的原始指针。稍后当您尝试释放内存时,您释放的是“二维矩阵”中的内存,而不是您刚刚分配的内存。
所有这些都会导致未定义的行为,因为您稍后会尝试取消引用之前释放的内存 (*(gameBoard + i)
)。
这里明显的解决方案是不重新分配指针,而是复制字符串,例如strcpy
。另一个非常明显的解决方案是根本不分配内存,甚至不使用 rowString
变量,因为您并不真正需要它,但可以直接在 [=15= 中使用指针 *(gameBoard + i)
] 打电话。
我正在尝试在 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+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
。但是在循环中,您 重新分配 变量以指向其他地方,从而丢失了指向您分配的内存的原始指针。稍后当您尝试释放内存时,您释放的是“二维矩阵”中的内存,而不是您刚刚分配的内存。
所有这些都会导致未定义的行为,因为您稍后会尝试取消引用之前释放的内存 (*(gameBoard + i)
)。
这里明显的解决方案是不重新分配指针,而是复制字符串,例如strcpy
。另一个非常明显的解决方案是根本不分配内存,甚至不使用 rowString
变量,因为您并不真正需要它,但可以直接在 [=15= 中使用指针 *(gameBoard + i)
] 打电话。