我必须在我的一个类中实现一个项目的函数,并且在调整2-D动态数组的尺寸(表示为字符板)方面遇到麻烦。如果我将尺寸(例如10 x 10的板)大小到较小的板(例如5 x 5),则该尺寸的大小似乎可以正常工作,并相应地截断了阵列。但是,如果我尝试增加板的大小,我会得到奇怪的结果或细分故障,我认为,因为Realloc以某种方式失败了。任何反馈都会有所帮助;我正在尽力理解指针,似乎无法围绕如何在没有内存错误的情况下完成此操作。在我编写的较大程序中,我具有释放董事会分配的内存的功能,但是在这里我主要关注我实施Realloc的方式。
#include <stdio.h>
#include <stdlib.h>
char** constructBoard(int num_rows, int num_cols, char empty_space){
//this function dynamically allocates a matrix of chars
char** board = (char**)malloc(num_rows * sizeof(char*));
for(int row = 0; row < num_rows; ++row){
board[row] = (char*)malloc(num_cols * sizeof(char));
for(int col = 0; col < num_cols; ++col){
board[row][col] = empty_space;
}
}
return board;
}
void displayBoard(char** board, const int num_rows, const int num_cols){
//this function prints out the board
int rowNum = num_rows - 1;
for(int row = 0; row < num_rows; ++row){
if(num_rows - row <= 10) {
printf(" ");
printf("%d ", rowNum);
}
else{
printf("%d ", rowNum);
}
rowNum = rowNum - 1;
for(int col = 0; col < num_cols; ++col){
printf(" %c", board[row][col]);
printf(" ");
}
printf("n");
}
printf(" ");
for(int i = 0; i < num_cols; ++i){
if(i == 0){
printf(" %d", i);
printf(" ");
}
else if(i < 10) {
printf(" %d", i);
printf(" ");
}
else{
printf("%d", i);
printf(" ");
}
}
printf("n");
}
void resizeBoard(char*** board, int new_num_row, int new_num_col, int* num_rows, int* num_cols){
//this function is supposed to resize the dimensions of the board without causing memory leaks
(*board) = realloc(*board, (new_num_row * sizeof(char*)));
for(int y = *num_rows; y < new_num_row; ++y){
(**board)[y] = '*';
}
for(int x = 0; x < new_num_row; ++x){
(*board)[x] = realloc((*board)[x], new_num_col * sizeof(char));
}
*num_rows = new_num_row;
*num_cols = new_num_col;
}
int main() {
char empty_space = '*';
int num_rows = 5;
int num_cols = 5;
char** board;
int new_num_row = 7;
int new_num_col = 7;
board = constructBoard(num_rows, num_cols, empty_space);
displayBoard(board, num_rows, num_cols);
resizeBoard(&board, new_num_row, new_num_col, &num_rows, &num_cols);
return 0;
}
c没有多维数组(仅数组的数组或指针数组)。因此,请考虑一些更好的方法,其中您将具有一些抽象的数据类型(例如,对于矩阵状对象,可以保持其维度)。
当然,您将更好地明确在重新限制木板时会初始化每个单元格。
不要忘记测试malloc
的失败,calloc
,realloc
使用所有警告和调试信息(使用GCC的gcc -Wall -Wextra -g
)编译您的代码,并使用调试器gdb
和Valgrind。