Инициализация и доступ к указателю из массива указателей - PullRequest
0 голосов
/ 27 апреля 2010

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

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, чтобы обеспечить правильную арифметику указателей, но я получаю предупреждение «инициализация из несовместимого типа указателя». Нужно ли печатать?

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

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

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

void **GetPtr(void **ptrElems, int index)
{
    void **elem = &ptrElems[index];
    return elem;
} 
0 голосов
/ 27 апреля 2010
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, предполагается, что вы хотите, чтобы целое число было похоже на индекс массива, и добавляло размер того, на что оно указывает, умноженное на целое число. Вот почему вы можете ++ или - указатель и получить указатель на следующий или предыдущий элемент.

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