Ошибка приведения пустого указателя?

Я работаю с пустым указателем в моей программе 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 * и т.п.

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