Создать двойной указатель на структуру для использования по индексу (например, массив, но максимальный размер неизвестен) - PullRequest
0 голосов
/ 14 февраля 2019

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

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

В VS я получил ошибку "Адрес записи нарушения доступа 0x0000000000000000"

typedef struct {
  char * data_3;
  int   data_1;
  float data_2;
  // and other data, doesnt matter
}obj_t;

void process_item(obj_t * input_item)
{
   // do something...
}

obj_t * create_new_item()
{
    obj_t * local_obj;
    // do something...
    return local_obj;
}

int get_max_items()
{
    return 8; // just some number, which can be set from outside
}

int main()
{
    int i;
    obj_t * item = NULL;
    obj_t ** item_indexer = NULL;

    for (i = 0; i < get_max_items(); i++)
    {
        item = create_new_item(); // create different items
        item_indexer[i] = &item;  // Error: access violation writing location 0x0000000000000000
    }

    process_item(item_indexer[i]); // need send item with specific index
}

Я ожидал использовать его как массив:

item_indexer[0] is (*item) created at i = 0
item_indexer[1] is (*item) created at i = 1
...

и смогу отправить конкретный элемент

Но я застрял с ошибками по поводу нарушения прав доступа.

1 Ответ

0 голосов
/ 14 февраля 2019

Нужно выделить память для двойного указателя тоже:

item_indexer = calloc(get_max_items(), sizeof(obj_t));

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

item_indexer[i] = item; // no need & here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...