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)
所以我认为我很聪明并且删除了一个我脑海中不需要的变量.有人可以告诉我为什么我的类型转换关闭?干杯.
你犯的错误是:
(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)