#c #struct #nested #malloc
#c #структура #вложенный #malloc
Вопрос:
Как вы правильно распределяете данные для структуры, подобной приведенной ниже (пробовали добавлять комментарии для ясности, но потратили слишком много часов, поэтому приношу извинения, если они практически не имеют смысла)?
struct Cell
{
int *iData;
char *cData;
};
struct Row
{
struct Cell *row;
};
struct Grid
{
struct Row *grid;
// Where maxData would be user defined
// would be the number of elements allocated to member variables of cell
int maxData;
// struct Row with rowSize = 3 would be like below?
// [*Cell][cell][cell][cell]
int rowSize;
// columnSize amp; rowSize = 3 would look something like below?
//[*Row][*Cell][cell][cell][cell]
//[*Row][*Cell][cell][cell][cell]
//[*Row][*Cell][cell][cell][cell]
int columnSize;
};
//somewhere else in program
struct Grid *g = malloc(sizeof(struct Grid));
//make user maxData rowSize columnSize assignments here
for(int i = 0; i < g->columnSize; i )
{
g->grid[i] = malloc(sizeof(struct Row));
for(int j = 0; i < g->rowSize; j )
{
g->grid[i]->row[j] = malloc(sizeof(struct Cell));
g->grid[i]->row[j]->iData = malloc((sizeof(int)) * g->maxData);
g->grid[i]->row[j]->cData = malloc((sizeof(char)) * g->maxData);
}
}
Моя логика для выделения памяти прямо здесь?
Пытался сделать что-то подобное в программе базы данных, с которой я играю, но это приводит к сбоям, и я не могу сказать, дает ли сбой мое понимание вложенных структур, подобных этой, или я просто немного запутался где-то еще в этом коде.
Заранее большое спасибо
Редактировать:
Структура, для которой я на самом деле пытаюсь понять, как выделить, приведена ниже, просто привел пример, чтобы кто-то не решил мою проблему за меня 🙂 :
struct Address {
int id;
int set;
char *name;
char *email;
};
struct Database {
struct Address *rows;
int maxData;
int maxRows;
};
struct Connection {
File *file;
struct Database *db;
};
Комментарии:
1. относительно:
for(int j = 0; i < g->rowSize; j )
переменнаяi
не изменяется вfor()
цикле. Я подозреваю, что вы имели в виду:for(int j = 0; j < g->rowSize; j )
2. да, извините, что изменил это после того, как я написал сообщение :), определенно был недосып
Ответ №1:
Более полезно использовать один malloc для всей матрицы (если это возможно). Для этого вы должны организовать свою структуру с массивом нулевой длины в качестве последнего члена:
struct grid {
int row_count;
int column_count;
int cell_capacity;
char data[];
};
В этом случае вы можете выделить память один раз. Например
int row_count = 2;
int column_count = 3;
int cell_capacity = 32;
struct grid* g = calloc(1, sizeof(struct grid) row_count*column_count*cell_capacity);
g->row_count = row_count;
g->column_count = column_count;
g->cell_capacity = cell_capacity;
for(int r = 0; r < row_count; r)
for(int c = 0; c < column_count; c)
strcpy(amp;g->data[r*column_count*cell_capacity c*cell_capacity], "hello");
// (*)
free(g);
В точке (*) в памяти ваш объект будет представлен следующим образом:
Комментарии:
1. Приветствую ответ, решил перестать лениться и просто реализовать его. Я добавил редактирование для фактической структуры, которую я пытался разработать, это был просто пример. Мой мозг определенно перестал функционировать около 10 часов назад, поэтому я собираюсь немного поспать и повторить попытку позже 🙂
2. Немного поиграл, понял, что я просто принципиально не понимаю, как правильно использовать gdb, поэтому попытка проанализировать, как структура хранится в памяти, становится сложнее, чем сложнее они становятся. Я думаю, нужно больше читать и играть. Спасибо за ответ, хотя, не думайте, что я правильно оценил, что когда вы malloc, вы просто получаете указатель, и то, как логически интерпретируется этот раздел памяти, полностью зависит от программиста