Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap的指针算法_C_Pointers_Casting_Mmap - Fatal编程技术网

C mmap的指针算法

C mmap的指针算法,c,pointers,casting,mmap,C,Pointers,Casting,Mmap,最近我试图修改某人的mmap代码,遇到了以下错误。(实际上,我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情——试图使用MAP_FIXED和他们自己的页面对齐内存。手册页建议使用NULL调用mmap,因为addr参数在Linux上应该这样做。) 所以我想我至少要测试一下用空地址调用mmap。然而,我不太理解gcc在我更改它时向我抛出的错误。当我得到赋值的左操作数所需的左值时,它们的代码工作正常 基本上,他们在做以下工作: uint8_t * ptr = (uint8_t *

最近我试图修改某人的mmap代码,遇到了以下错误。(实际上,我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情——试图使用MAP_FIXED和他们自己的页面对齐内存。手册页建议使用NULL调用mmap,因为addr参数在Linux上应该这样做。) 所以我想我至少要测试一下用空地址调用mmap。然而,我不太理解gcc在我更改它时向我抛出的错误。当我得到赋值的左操作数所需的左值时,它们的代码工作正常

基本上,他们在做以下工作:

    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
)可能是错误的,除非您确定永远无法释放它。