无效指针转换错误?

时间:2014-03-31 08:17:08

标签: c pointers void

我正在使用我的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

2 个答案:

答案 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 *等。