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

Это пример того, как выглядит мой код:

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

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не хочу, чтобы «а» указывал на адрес, который на 4 байта больше, чем «б». В моей программе я знаю, что значение, хранящееся в ((char *) b + 4), само по себе является другим указателем, и я хочу сохранить этот указатель в «a».

Ответы [ 4 ]

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

Это char*:

(char *)b + 4

Это означает, что это:

*((char *)b + 4)

- это char. Затем вы продолжаете приводить это char к void*, и компилятор жалуется. Вам не нужно вручную приводить к void* в C, так что только это должно сделать:

a = (char *)b + 4;

Обновление для комментариев : Похоже, вы после этого:

a = *(char **)((char *)b + 4)
0 голосов
/ 17 октября 2011
void *a = NULL;
char jig[10]="jigarkumar";
void *b = jig;
printf("b is %p",b);
a = (void *)(((char *)b + 4));
printf("\na is %p",a);

проблема здесь

a = (void *)(*((char *)b + 4));
             ^
             |

this * извлекает значение, сохраненное по адресу b + 4, и оно присваивается неправильному значению a, поэтому просто удалите это, и ваш код будет работать нормально

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

это улучшило бы читабельность, если бы вы написали операторы отдельно Я сделал это для вас и получил:

char *c = (char *)b;
char *d = c + 4;
a = (void *)
        (*d); // <- this is c char and you want to cast it to a pointer

похоже, что вы написали звездочку слишком много

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

Как это звучит: что-то не так в ваших указателях.

В этом случае еще раз проверьте свое выражение: действительно ли это адрес char, который вы получаете?

(void *)(*((char *)b + 4));

так

(char *)b

является указателем на char, как и

(char *)b+4

но затем *((char *)b+4) разыменовывает (char *)b+4, так что это тип char - и вы затем пытаетесь преобразовать эту вещь, которая, вероятно, составляет 1 байт, в 4 или 8-байтовый адрес. Ergo, несоответствующие размеры.

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