Я изучаю 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;
}