От массива указателей фиксированного размера до динамического массива указателей c - PullRequest
0 голосов
/ 12 января 2020

Мне нужно перейти от использования массива указателей фиксированного размера к динамическому c. В настоящее время код выглядит следующим образом:

struct myType *fixed_bufs[TEST_SZ];

Каждый элемент из fixed_bufs выделяется в памяти другим модулем; указатели на них просто хранятся в fixed_bufs и в конце концов освобождаются, а еще один добавляется и т. д.

Теперь я хочу сделать TEST_SZ динамическим c, что означает (насколько мне известно C) идет) я сделаю:

struct myType **bufs;

вместе с предварительным выделением памяти для хранения только указателей:

bufs = (struct myType **)malloc(TEST_SZ * sizeof(struct myType *));

Имеет ли это смысл и является ли это правильным / законным? Мой другой модуль просто работает за кулисами:

    struct myType *v1 = malloc(sizeof(struct myType));
    v1->a = 1024+i;
    v1->b = 2048+i;

и затем он сохраняет указатель в моем массиве указателей:

    bufs[i] = v1;

Через некоторое время память элементов сохраняется в моем списке освобождаются, и мой список указателей пополняется.

Я спрашиваю это, потому что мое приложение каким-то образом работает, но оно странным образом падает, и я не могу отладить его.

Я создал небольшое демонстрационное тестовое приложение ниже, чтобы лучше описать ситуацию Шаг выделения памяти, который мне не хватает?

Я просто хочу указатели хранилища, фактические данные выделяются и освобождаются другим модулем, как я уже сказал.

Вот код:

#include <stdio.h>
#include <string.h>

struct myType {
    int a;
    int b;
};

#define TEST_SZ 2048

void fill_data(struct myType **bufs)
{

    for (int i = 0; i < TEST_SZ; i++)
    {
        struct myType *v1 = malloc(sizeof(struct myType));
        v1->a = 1024+i;
        v1->b = 2048+i;
        bufs[i] = v1;
    }
}

void empty_data(struct myType **data)
{
    for (int i = 0; i < TEST_SZ; i++)
    {
        free(data[i]);
    } 
}


int main()
{   
    struct myType **bufs;
    struct myType *fixed_bufs[TEST_SZ];

    bufs = (struct myType **)malloc(TEST_SZ * sizeof(struct myType *));


    for (int i = 0; i < 100; i++)
    {
      fill_data(bufs);
      fill_data(fixed_bufs);

      printf("nth iter: %d => %d %d\n", i, bufs[TEST_SZ-1]->a, bufs[TEST_SZ-1]->b);
      printf("fixed_bufs nth iter: %d => %d %d\n", i, fixed_bufs[TEST_SZ-1]->a, fixed_bufs[TEST_SZ-1]->b);

      empty_data(bufs);
      empty_data(fixed_bufs);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...