Инициализация и доступ к указателю из массива указателей

109
9

Предположим, что у меня есть следующее:


void **Init(int numElems)
{
//What is the best way to initialize 'ptrElems' to store an array of void *'s?
void **ptrElems = malloc(numElems * sizeof(void *));
return ptrElems;
}

//What is the best way to return a pointer pointing at the index passed as a parameter?
void **GetPtr(void **ptrElems, int index)
{
void **elem = elems + (index * sizeof(void *));
return elem;
}


Во-первых, что лучший способ инициализировать 'ptrElems' для хранения массива указателей? Я использую malloc, потому что назначение его массиву не будет сохраняться после окончания функции.


Во-вторых, каков наилучший способ указать указатель на указанный индекс? Я попытался приписать первую строку функции "GetPtr", чтобы обеспечить правильную арифметику указателя, но я получаю предупреждение "инициализация из несовместимого типа указателя". Нужно ли придумывать?

спросил(а) 2021-01-19T13:17:51+03:00 6 месяцев назад
1
Решение
64

Инициализация должна работать таким образом, просто запомните free() память снова, как только вы закончите с ней.


Чтобы получить адрес определенного элемента, вы можете использовать доступ к нормальному индексу массива вместе с адресом-оператором &:

void **GetPtr(void **ptrElems, int index)
{
void **elem = &ptrElems[index];
return elem;
}

ответил(а) 2021-01-19T13:17:51+03:00 6 месяцев назад
45

void **Init(int numElems)
{
// This allocates the memory and sets it to 0 (NULL)
void **ptrElms = calloc(numElems * sizeof(void *) );
return ptrElems;
}

Вы также можете вызвать memset или bzero в памяти после его выделения, что будет иметь тот же результат, но тогда вам нужно будет проверить возвращаемое значение перед обнулением памяти в случае неудачи malloc.


Ответ на sth будет работать для следующей части, но так будет:

void **GetPtr(void **ptrElems, int index)
{
return ptrElems + index;
}

Когда вы добавляете целое число в указатель, C предполагает, что вы хотите, чтобы целое число было как индекс массива, и добавляет sizeof, что указывает на количество целых чисел. Вот почему вы можете ++ или - указатель и получить указатель на следующий или предыдущий элемент.

ответил(а) 2021-01-19T13:17:51+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема