Использование массива и выделение памяти в структуре (элементы гибкого массива)

Итак, есть 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 определяет массив указателей, но ваше выделение предназначено для массива структур. Для хеш-таблицы я бы посоветовал вам использовать массив указателей. Если это так, вам нужно выделить таблицу, а затем вам нужны отдельные выделения для структур при добавлении элементов в хеш-таблицу.

kaylum 21.12.2020 02:17
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите выделить способ, которым вы показываете, вам нужно объявить его как:

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)
;}

https://godbolt.org/z/e66vzq

Вы хотели объявить это как struct Morning *task[];? также после объявления я делаю table->task[0]->time = 2; и получаю ошибку сегмента. Почему это так?

koozyy 21.12.2020 14:13

я так заявлял? Я думаю, вам нужно немного изучить язык C. godbolt.org/z/e66vzq

0___________ 21.12.2020 17:03

о, хорошо, мне действительно нужно сохранить формат структур как есть, потому что это проект. Спасибо за ответ и за ссылку, хотя

koozyy 21.12.2020 21:03

Другие вопросы по теме