我正在使用我的c程序中的void指针。我有一个if语句强制将数据集打印到32字节的边界。
**我应该注意,我正在尝试修改mem指针的地址以将其转移到边界**
我收到以下错误:
Operation between types "void*" and "int" is not allowed
我的代码如下:
if(((int)mem % 32) != 0)
mem -= ((int)mem % 32);
其中mem定义为:
void *mem
答案 0 :(得分: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);
请注意,指针转换通常是实现定义的。没有标准的方法来推理“对齐”,从指针获得的积分值可能与硬件中的内存布局有关,也可能没有。
答案 1 :(得分:2)
你不能用void *
:
mem -= ((int)mem % 32);
未定义,因为*mem
没有“内在大小”。
可能有编译器(hello,gcc
!)允许这作为扩展,但一般情况下,你只能对具有大小的类型的指针进行指针算术,例如{{1 },char *
等。