7

最近我试图调整某人的 mmap 代码并遇到以下错误。(实际上我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情 - 尝试将 MAP_FIXED 与他们自己的页面对齐内存一起使用。手册页建议使用 NULL 调用 mmap 作为 addr 参数应该在 Linux 上执行此操作。)所以我想我至少会测试使用 NULL 地址调用 mmap。但是,当我更改它时,我不太明白 gcc 向我抛出的错误。他们的代码工作正常,而我将lvalue required 作为 assignment 的左操作数

本质上,他们在做以下事情:

    uint8_t * ptr = (uint8_t *)mem;
    if ((uint32_t)ptr % PAGE_SIZE)
    {
        ptr += PAGE_SIZE - ((uint32_t)ptr % PAGE_SIZE);
    }

其中 mem 是一些 malloc 内存的 void *。

我正在尝试或多或少地使用类型转换:

    if ((uint32_t)mem % PAGE_SIZE)
    {   
        (uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
    }

所以我认为我很聪明,并删除了一个我认为不需要的变量。有人可以告诉我为什么我的类型转换关闭了吗?干杯。

4

1 回答 1

6

你犯的错误是:

(uint8_t *)mem += /* Anything.  */

您根本无法分配给强制转换的结果。强制转换的结果与原始表达式的值不同。

想想这样做会有多奇怪:

(int) some_char_variable = 9999;

我曾经因为同样的原因遇到过麻烦

使用临时,并写回结果,或者,正如R..在他们的评论中所说:

mem = (void *) ( ( (uint8_t *) mem) + SOME_EXPRESSION );
于 2012-07-08T13:32:30.773 回答