我正在学习 C,我正在尝试在其中拥有一个虚拟网格,用户可以在其中放置新的网格元素以"激活"到控制台中。因此,例如,如果我从零开始并且用户添加 (40,50(,那么大小至少为 40x50,元素 (40,50( 初始化。如果 (20,30( 紧随其后,它只是在 20,30 处激活元素。但是,如果用户随后输入 (500,300(,它将分配更多内存并增加数组的大小。我想轻松访问它们。我想工作(无论如何我可能不得不工作(,因为它们对我来说是新的。 我的代码(目前(如下:
int width = 4, height = 5;
bool **arr = (bool **) malloc(height * sizeof(bool *));
for (int x = 0; x < height; x++) {
arr[x] = (bool *) malloc(width * sizeof(bool));
}
for (int x = 0; x < height; x++) {
for (int y = 0; y < width; y++) {
*(*(arr + x) + y) = false;
}
}
*(*(arr + 3) + 2) = true;
// user puts a value bigger than (4,5) inside
int newX=10, newY = 10;
//allocate more memory
所以我使用带有布尔值的 2D 指针,我先"malloc"高度,然后为宽度制作一个数组。
最后一行只是在 (2,3( 处输入第一个元素的示例。用户的扫描方法在这里无关紧要。
那么有没有办法在之后增加我的数组的大小,或者我是否需要一个完全不同的概念?
===== 当前代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main() {
int width = 4, height = 5;
bool **arr = (bool **) malloc(height * sizeof(bool *));
for (int x = 0; x < height; x++) {
arr[x] = (bool *) malloc(width * sizeof(bool));
}
for (int x = 0; x < height; x++) {
for (int y = 0; y < width; y++) {
*(*(arr + x) + y) = false;
}
}
*(*(arr + 3) + 2) = true;
int newWidth = 10, newHeight = 10;
bool **narr = realloc(arr, newHeight * sizeof(bool*));
if(narr) {
arr = narr;
for(size_t i = 0; i < newHeight; i++){
bool* p = realloc(arr[i] , newWidth * sizeof(bool));
if( !p ){
perror("realloc");
}
arr[i] = p;
}
// here resize the number of elements if needed
}
else {
perror("realloc failed");
exit(EXIT_FAILURE);
}
return 0;
}
是的,有一个叫做realloc
的mathod。你可以使用它。您可以完全调整交错数组的大小。
bool **narr = realloc(arr , newsize * sizeof(bool*));
if( narr ) {
arr = narr;
for(size_t i = 0; i < newsize; i++){
bool* p = realloc(arr[i] , newsize1 * sizeof(bool));
if( !p ){
perror("realloc");
}
arr[i] = p;
}
// here resize the number of elements if needed
}
else {
perror("realloc failed");
exit(EXIT_FAILURE);
}
也简化事情写a[1][2]
而不是*(*(a+1)+2)
.检查是必需的,因为realloc
可能会失败 - 在这种情况下,与其让您的代码出错,不如根据需要采取适当的步骤。
另请注意,您需要将所有新分配的bool*
设置为NULL
。所以这样做:-
for(size_t i = 0; i < newHeight; i++){
if( i >= height)
arr[i] = NULL;
bool* p = realloc(arr[i] , newWidth * sizeof(bool));
if( !p ){
perror("realloc");
}
arr[i] = p;
}
这是必需的,因为realloc
期望以前分配有*alloc
函数或NULL
的内存地址。
您可以使用realloc来增加数组的大小
在你的情况下,你会这样做
arr = (bool **)realloc(arr, sizeof(bool*) * new_height)
for(int i = 0; i < new_height; i++){
arr[i] = (bool *)realloc(arr, sizeof(bool) * new_width);
}
请注意,您必须检查数组是否需要变大,realloc 也可以"缩小"您的阵列,因此请小心行事。
将新创建的内存初始化为 false:
for(int i = old_height; i < new_height; i++){
for(int j = old_width; j < new_width; j++){
arr[i][j] = false;
}
}
arr[new_height - 1][new_width - 1] = true;