C mmap的指针算法
最近我试图修改某人的mmap代码,遇到了以下错误。(实际上,我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情——试图使用MAP_FIXED和他们自己的页面对齐内存。手册页建议使用NULL调用mmap,因为addr参数在Linux上应该这样做。) 所以我想我至少要测试一下用空地址调用mmap。然而,我不太理解gcc在我更改它时向我抛出的错误。当我得到赋值的左操作数所需的左值时,它们的代码工作正常 基本上,他们在做以下工作:C mmap的指针算法,c,pointers,casting,mmap,C,Pointers,Casting,Mmap,最近我试图修改某人的mmap代码,遇到了以下错误。(实际上,我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情——试图使用MAP_FIXED和他们自己的页面对齐内存。手册页建议使用NULL调用mmap,因为addr参数在Linux上应该这样做。) 所以我想我至少要测试一下用空地址调用mmap。然而,我不太理解gcc在我更改它时向我抛出的错误。当我得到赋值的左操作数所需的左值时,它们的代码工作正常 基本上,他们在做以下工作: uint8_t * ptr = (uint8_t *
uint8_t * ptr = (uint8_t *)mem;
if ((uint32_t)ptr % PAGE_SIZE)
{
ptr += PAGE_SIZE - ((uint32_t)ptr % PAGE_SIZE);
}
其中mem对于某个malloc'd内存来说是一个空白
我正在尝试大致相同的类型转换:
if ((uint32_t)mem % PAGE_SIZE)
{
(uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
}
所以我觉得我很聪明,删除了一个我不需要的变量。
有人能告诉我为什么我的打字不好吗?
干杯。你犯的错误是:
(uint8_t *)mem += /* Anything. */
您不能简单地分配给强制转换的结果。强制转换的结果与原始表达式的值不同
想想这样做会有多奇怪:
(int) some_char_variable = 9999;
我有过一次
使用temp,并写回结果,或者,如R..在他们的评论中所说:
mem = (void *) ( ( (uint8_t *) mem) + SOME_EXPRESSION );
谢谢你,我需要一双新的眼睛:)如果+=分离操作工作:)不,这将在没有温度的情况下工作:
mem=(void*)((uint8_t*)mem+页面大小-((uint32_t)mem%页面大小))代码>这是一个值,与临时对象有很大不同。顺便说一下,您的“我选择的解决方案”解决方案是错误的。这是一个别名冲突,并调用未定义的行为。如果你这样做,现实世界的编译器可以并且将生成非工作代码。是的,我会说答案是错误的。正确的答案只是#定义我的数据(bb)((struct a_long_struct_name*)(bb)->aux))
,而不是试图将我的数据(bb)
用作左值(因为它不是,也不能是)。相反,只需编写bb->aux=malloc(…)代码>这不是答案,但应该注意的是,原始代码做了很多错误的事情。如果地址从页面对齐开始,他们的页面对齐代码将浪费整个页面。如果在malloc
获得的内存上使用mmap
(使用MAP\u FIXED
)可能是错误的,除非您确定永远无法释放它。