Приведение указателя на int
Я пишу свои собственные функции для malloc
а также free
в C для назначения. Мне нужно воспользоваться C sbrk()
функция обертки. Из того, что я понимаю sbrk()
увеличивает пространство данных программы на количество байтов, переданных в качестве аргумента, и указывает на место прерывания программы.
Если у меня есть следующий фрагмент кода:
#define BLOCK_SIZE 20
int x;
x = (int)sbrk(BLOCK_SIZE + 4);
Я получаю ошибку компилятора warning: cast from pointer to integer of different size
, Почему это так и есть, так или иначе, я могу разыграть адрес, на который указывает sbrk()
для int
?
1 ответ
Я получаю предупреждение об ошибке компилятора: приведение от указателя к целому разного размера.
Почему это
Потому что указатель и int
может иметь разную длину, например, в 64-битной системе, sizeof(void *)
(т.е. длина указателя) обычно составляет 8, но sizeof(int)
обычно 4. В этом случае, если вы приведете указатель на int
и приведя его обратно, вы получите неверный указатель вместо исходного указателя.
и в любом случае я могу привести адрес, на который указывает sbrk(), к int?
Если вам действительно нужно привести указатель к целому числу, вы должны привести его к intptr_t
или же uintptr_t
, от <stdint.h>
,
От <stdint.h>(P)
:
- Целочисленные типы, способные содержать указатели на объекты
Следующий тип обозначает целочисленный тип со знаком со свойством, что любой действительный указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void, и результат будет сравниваться равным исходному указателю:
intptr_t
Следующий тип обозначает целочисленный тип без знака со свойством, что любой действительный указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void, и результат будет сравниваться равным исходному указателю:
uintptr_t
В XSI-совместимых системах
intptr_t
а такжеuintptr_t
типы требуются; в противном случае они являются необязательными.