gpt4 book ai didi

c - C 中的动态 2 数组

转载 作者:行者123 更新时间:2023-11-30 19:30:37 25 4
gpt4 key购买 nike

我正在学习 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

所以我使用带有 bool 值的 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 。你可以使用它。您可以完全调整锯齿状数组的大小。

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 分配的内存地址。

关于c - C 中的动态 2 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50426804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com