mmap的指针算法

Ala*_*lan 7 c pointers casting mmap

最近我试图调整某人的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);
    }
Run Code Online (Sandbox Code Playgroud)

mem是某些malloc内存的空白*.

对于类型转换,我或多或少都在尝试:

    if ((uint32_t)mem % PAGE_SIZE)
    {   
        (uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
    }
Run Code Online (Sandbox Code Playgroud)

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

Arj*_*kar 6

你犯的错误是:

(uint8_t *)mem += /* Anything.  */
Run Code Online (Sandbox Code Playgroud)

你根本无法分配一个演员的结果.强制转换的结果与原始表达式的值不同.

想想它会有多奇怪:

(int) some_char_variable = 9999;
Run Code Online (Sandbox Code Playgroud)

我曾因同样的原因遇到麻烦.

使用temp,并将结果写回OR,如R ..在评论中说:

mem = (void *) ( ( (uint8_t *) mem) + SOME_EXPRESSION );
Run Code Online (Sandbox Code Playgroud)

  • 不,这没有临时工作:`mem =(void*)((uint8_t*)mem + PAGE_SIZE - ((uint32_t)mem%PAGE_SIZE));` (2认同)
  • 顺便说一下,你的"我选择的解决方案"解决方案是错误的.这是一个锯齿违规并调用未定义的行为.如果你这样做,真实编译器可以并且将生成非工作代码. (2认同)
  • 是的,我会说答案是对的.正确答案只是`#define MY_DATA(bb)(((struct a_long_struct_name*)(bb) - > aux))`而不是试图用'MY_DATA(bb)`作为左值(因为它不是,也不能是).而只是写`bb-> aux = malloc(...);` (2认同)