Как выровнять адрес по пустому указателю? - PullRequest
1 голос
/ 19 декабря 2011

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

shmPool shm;
void getMemory(void* mPtr){
   mPtr = &shm;
}

, но ясно, что значение mPtr не изменяется.Как можно выровнять значение указателя по указателю неизвестного типа.

Ответы [ 3 ]

4 голосов
/ 19 декабря 2011

Почему бы просто не вернуть указатель вместо использования параметра out?

void* getMemory() {
    return &shm;
}
2 голосов
/ 19 декабря 2011

Вот ваш код, измененный так, что вызывающий абонент получит указатель на shm:

shmPool shm;
void getMemory(void** mPtr){
   *mPtr = &shm;
}

Вызывающая сторона будет вызывать эту функцию следующим образом:

shmPool* p;
getMemory(&p);
// now p is a valid pointer

Ваш вопрос не имеет ничего общего с выравниванием памяти. Однако в вашем коде есть проблемы, поэтому возьмите мой ответ с небольшим количеством соли:

  1. Почему вы приводите объект к void*? Это почти наверняка плохо.
  2. Я согласен с @ Björn Pollex, что в этом примере лучше использовать возвращаемое значение, а не выходной параметр.
0 голосов
/ 19 декабря 2011

mPtr является локальной переменной. Изменяется только локальная копия - почему любая другая переменная будет изменена? Если вы хотите изменить другой указатель, вам нужно взять ссылку или указатель на него.

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