Как динамически распределить массив структур внутри функции в C - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь динамически изменить размер массива структур внутри функции, которая читает данные из файла, поэтому я не знаю размер во время компиляции.

При заполнении динамически возникает ошибка выделенные массивы "Исключение исключено: нарушение прав записи") в главной строке в одной из строк, присваивающей значения этому массиву по (на вид) случайному индексу, например i=170 в (mystruct_array)[i].b = i в основном, что указывает на то, что я неправильно распределяю память в функции. Я искал здесь, но не могу найти, что я делаю неправильно - я ценю, что это, вероятно, что-то тривиальное, что мне не хватает. Итак, пожалуйста, что я делаю не так здесь?

#define ELEMENT_COUNT   10000

typedef struct mystruct
{
    uint64_t a;
    uint64_t b;
    uint64_t c;
} mystruct_t;

void test(mystruct_t ** p_struct_array, uint32_t * p_count)
{
    *p_count = ELEMENT_COUNT;
    *p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t *));
}

void main()
{
    mystruct_t * mystruct_array = NULL;
    uint32_t count;
    test(&mystruct_array, &count);
    for (uint64_t i = 0; i < ELEMENT_COUNT; i++)
    {
        (mystruct_array)[i].a = i;
        (mystruct_array)[i].b = i;
        (mystruct_array)[i].c = i;
    }
    getch();
}

1 Ответ

2 голосов
/ 06 апреля 2020
*p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t *));

должно быть

*p_struct_array = malloc(ELEMENT_COUNT * sizeof(mystruct_t));

Вы хотите выделить массив 10000 mystruct_t с, а не 10000 указателей.


Многие люди предлагают избегать подобных ошибок всегда следуя шаблону, подобному

ptr = malloc(count * sizeof(*ptr));

, который в вашем случае будет читать

*p_struct_array = malloc(ELEMENT_COUNT * sizeof(**p_struct_array));

, и на самом деле тип **p_struct_array равен mystruct_t, а не mystruct_t *.

...