【发布时间】:2017-12-15 02:34:43
【问题描述】:
分配:我们有一个用户可以“绘画”的画布——他们可以画线、添加或删除行/列等。我们必须实现的命令之一是调整画布的大小。根据分配规范,新行添加到画布顶部,新列添加到右侧。这些新的行/列用空格填充,用“*”表示。用户输入r numRows numCols。
我苦苦挣扎的部分是使用 realloc。如果我有一个 5x5 的画布开始,并且用户决定将大小调整为 7x5,我会怎么做? realloc 将新行/列放在哪里,它会自动将现有行向下移动吗?我有一个函数 implementResize,当用户输入 r 时会调用它:
void implementResize(BoardState* boardState, int newRows, int newCols) {
if (newRows > boardState->board.numRows) {
printf("add rows\n");
addRow(boardState, newRows);
}
else if (newCols < boardState->board.numRows) {
printf("delete rows\n");
//deleteRow();
}
else {
printf("same\n");
boardState->board.numRows = newRows;
}
if (newCols > boardState->board.numCols) {
printf("add columns\n");
//addCol();
}
else if (newCols < boardState->board.numCols) {
printf("delete columns\n");
//deleteCol();
}
else {
printf("same\n");
boardState->board.numCols = newCols;
}
}
现在我专注于如何在画布顶部添加行。我现在的 addRow 函数代码是:
void addRow(BoardState *boardState, int newRows) {
boardState->board.numRows = newRows;
boardState->board.theBoard = (char**) realloc(boardState->board.theBoard, boardState->board.numRows * sizeof(char*));
}
我试图弄清楚如何为行重新分配空间。我知道我需要根据 newRows 的数量和列的数量使用嵌套的 for 循环,但我不确定这些新行的去向。如果有人能解决我的困惑,我将不胜感激。
【问题讨论】:
-
“realloc 将新的行/列放在哪里,它会自动将现有的行向下移动吗?” (1) 它不理会它们——新的块内存最后会有额外的空间。 (2) 它不会改变任何东西。 (和3)不要
realloc指针本身,如果realloc失败,你会丢失指向原始内存块的指针,而不是void *tmp = realloc (boardState->board.theBoard, boardState->board.numRows * sizeof (char*)); if (!tmp) { /* handle error */ } boardState->board.theBoard = tmp;