最近我试图改编某人的mmap代码并遇到以下错误。 (我现在对他们的代码实际上有点怀疑,因为看起来他们正在做一些不必要的事情 - 尝试将MAP_FIXED与他们自己的页面对齐的内存一起使用。该联机帮助页建议使用NULL调用mmap,因为addr参数应该在Linux上执行此操作。) 所以我想我至少会测试用NULL地址调用mmap。但是我不太明白当我改变它时gcc对我不利的错误。他们的代码工作正常,而我需要左值作为分配的左操作数。
基本上他们正在做以下事情:
uint8_t * ptr = (uint8_t *)mem;
if ((uint32_t)ptr % PAGE_SIZE)
{
ptr += PAGE_SIZE - ((uint32_t)ptr % PAGE_SIZE);
}
如果mem是某些malloc内存的空白*。
我对类型转换大致相同:
if ((uint32_t)mem % PAGE_SIZE)
{
(uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
}
所以我认为我很聪明并且删除了一个我脑海中不需要的变量。 有人可以告诉我为什么我的类型转换关闭? 欢呼声。
答案 0 :(得分:6)
您犯的错误是:
(uint8_t *)mem += /* Anything. */
您根本无法分配演员表的结果。强制转换的结果与原始表达式的值不同。
想想它会有多奇怪:
(int) some_char_variable = 9999;
我曾经trouble for the same reason一次。
使用临时值,并将结果写回,或者,如 R .. 在评论中所述:
mem = (void *) ( ( (uint8_t *) mem) + SOME_EXPRESSION );