Итак, есть 2 структуры:
struct Morning {
int time;
int day;
struct Morning *next; //pointer for the next node if there are any collisions
};
struct Days_Hash_Table {
int count;
struct Morning **task; // array for the hash table
};
Как я могу выделить память для struct Morning **task
? Кроме того, как я могу определить размер массива? (размер всегда хранится в глобальной переменной, скажем, array_size
.)
Я пробовал следующее:
struct Days_Hash_Table* table = malloc(sizeof(struct Days_Hash_Table)+ sizeof(struct Morning)*array_size);
и когда я пытался получить доступ к массиву, например, table->task[0]->time = 0;
я получил ошибку сегментации. Каков правильный подход к этому? Также будет легче, если я поменяю **task
на *task[]
?
Спасибо!
Если вы хотите выделить способ, которым вы показываете, вам нужно объявить его как:
struct Days_Hash_Table {
int count;
struct Morning task[];
};
и выделить:
struct Days_Hash_Table* table = malloc(sizeof(*table)+ sizeof(table -> task[0])*array_size);
РЕДАКТИРОВАТЬ
struct Morning {
int time;
int day;
struct Morning *next; //pointer for the next node if there are any collisions
};
struct Days_Hash_Table {
int count;
struct Morning task[];
};
struct Days_Hash_Table*alloc(size_t array_size)
{
struct Days_Hash_Table* table = malloc(sizeof(*table)+ sizeof(table -> task[0])*array_size);
if (table)
{
for(size_t index = 0; index < array_size; index++)
{
table -> task[index].time = index + 1;
table -> task[index].day = index + 100;
}
}
return table;
}
int main(void)
{
struct Days_Hash_Table* table = alloc(20);
if (table)
{
for(size_t index = 0; index < 20; index++)
{
printf("Time[%zu] = %d ", index, table -> task[index].time);
printf("Day[%zu] = %d\n", index, table -> task[index].day);
}
}
free(table)
;}
Вы хотели объявить это как struct Morning *task[];
? также после объявления я делаю table->task[0]->time = 2;
и получаю ошибку сегмента. Почему это так?
я так заявлял? Я думаю, вам нужно немного изучить язык C. godbolt.org/z/e66vzq
о, хорошо, мне действительно нужно сохранить формат структур как есть, потому что это проект. Спасибо за ответ и за ссылку, хотя
Сначала вам нужно решить, являются ли элементы вашей таблицы указателями или структурами.
struct
определяет массив указателей, но ваше выделение предназначено для массива структур. Для хеш-таблицы я бы посоветовал вам использовать массив указателей. Если это так, вам нужно выделить таблицу, а затем вам нужны отдельные выделения для структур при добавлении элементов в хеш-таблицу.