Ошибка приведения пустого указателя?
Я работаю с пустым указателем в моей программе c. У меня есть оператор if, который вынуждает печатать набор данных с 32-байтовой границей.
** Я должен отметить, что я пытаюсь изменить адрес указателя mem, чтобы переместить его к границе **
Я получаю следующую ошибку:
Operation between types "void*" and "int" is not allowed
Мой код выглядит следующим образом:
if(((int)mem % 32) != 0)
mem -= ((int)mem % 32);
где mem определяется как:
void *mem
2 ответа
Что-то вроде этого:
void * mem; // input
char * p = mem; // byte-wise arithmetic
uintptr_t n = (uintptr_t) p; // integral arithmetic
p -= n % 32 // align
mem = p; // output
Обратите внимание, что это предполагает, что память до адреса mem
баллы уже выделены и тоже ваши.
Конечно, вы можете сжать код в одно утверждение:
mem = (char *) mem - ((uintptr_t) mem % 32);
Помните, что преобразования указателей обычно определяются реализацией. Не существует стандартного способа рассуждения о "выравнивании", и интегральное значение, полученное из указателя, может иметь или не иметь никакого отношения к расположению памяти в аппаратном обеспечении.
Вы не можете делать арифметику указателей с void *
:
mem -= ((int)mem % 32);
не определяется, как *mem
не имеет "собственного размера".
Там могут быть компиляторы (привет, gcc
!), которые допускают это как расширение, но в общем случае арифметику указателей можно выполнять только для указателей типов, имеющих размер, например char *
, int *
и т.п.