Что означает «присваивание делает указатель из целого числа без приведения»? - PullRequest
1 голос
/ 17 октября 2011

Ранее я задавал похожий вопрос, но с тех пор я изменил свой код.Теперь компилятор выдает мне другое предупреждение.Это пример того, как мой код выглядит сейчас:

void *a = NULL;
void *b = //something;
a = *(int *)((char *)b + 4);

Когда я пытаюсь скомпилировать, я получаю «предупреждение: присваивание делает указатель из целого числа без приведения».Что это значит, и что я должен сделать, чтобы это исправить?

Чтобы уточнить, я не хочу, чтобы 'a' указывал на адрес, который на 4 байта больше, чем 'b' (то есть a!= b + 4).В моей программе я знаю, что значение, хранящееся в ((char *) b + 4), само по себе является другим указателем, и я хочу сохранить этот указатель в «a».

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Итак, в b+4 хранится значение указателя, которое вы хотите загрузить в a?Затем обработайте его как единое целое, и поэтому (b + 4) указывает на указатель - указатель на указатель на int равен int**.:

  *(int**)((char*)b+4) 
1 голос
/ 17 октября 2011

Поскольку «значение, хранящееся в ((char *)b + 4), само по себе является другим указателем», просто добавьте явное приведение к результату:

void *a = NULL;
void *b = //something;
a = (void*)*(int *)((char *)b + 4);

Поскольку вы предполагаете, что sizeof(void*)==sizeof(int), код не является переносимым, но я уверен, что вы уже знали это.

Переносной альтернативой является использование intptr_t вместо int.

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