Приведение указателя на 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 типы требуются; в противном случае они являются необязательными.

Другие вопросы по тегам