Мне нужно перейти от использования массива указателей фиксированного размера к динамическому 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);
}
}