2017-06-05 178 views
0

我正在编写一个程序,并得到了一个内存位置,我已经存储为一个无符号整型和映射的长度为一个无符号整型,我想取消映射。解决munmap警告消息

我下面的方法产生的警告:

warning: passing argument 1 of ‘munmap’ makes pointer from integer without a cast [enabled by default] 

/usr/include/i386-linux-gnu/sys/mman.h:77:12: note: expected ‘void *’ but argument is of type ‘unsigned int’ 

,并在这里引起了我的注意:

//startAddr and addrRange are stored as an unsigned int, 
void unmap(mapping_t *maps, const int *curSize){ 
    int i = 0; 
    for (; i < *curSize; i++){ 
    munmap(maps[i].startAddr, maps[i].addrRange); 
    } 
} 

我的程序也崩溃了,当我打了munmap,但我假设有以某种方式处理警告

根据要求定义struct mapping_t:

typedef struct mapping{ 
    unsigned int startAddr; 
    unsigned int endAddr; 
    unsigned int addrRange; 
} mapping_t; 
+1

发布'mapping_t'的定义。我当然希望你没有把指针值填充到'unsigned int'中。 –

+0

编译器肯定认为他是 – pm100

回答

2

您不能对指针使用unsigned int。使用void *。

typedef struct mapping{ 
     void * startAddr; 
     void * endAddr; 
     unsigned int addrRange; 
    } 
mapping_t; 
3

我正在写一个程序,并已经得到了那我已经存储为unsigned int类型

不要做一个内存位置。使用void *,char *或甚至[u]intptr_t。不要将指针填入unsigned int。那是错的。指针不是int的值,可能不会被int正确表示,这就是为什么您会收到警告。每个C标准允许指针转换为int - 这就是为什么你会得到一个警告而不是实际的错误 - 但是不能保证转换回指针值的结果是相同的地址。

和映射的长度作为无符号int,我想取消映射此。

不要这样做。使用size_t

typedef struct mapping{ 
    void *startAddr; 
    size_t addrRange; 
} mapping_t; 

你不需要endAddr有您的起始地址和大小。如果您需要结束地址,则需要将startAddr转换为char *以计算结束地址。

+0

如果我改变类型'void *',我将如何去读''无符号int'到我的'startAddr'?我改变了我读取数值的方式,如下所示:'sscanf(line,“%x-%x%s”,(unsigned int *)maps [* curSize] .startAddr,...)'但它导致我的程序现在崩溃了我的尝试 –

+0

“在我的'startAddr'(带有'scanf')”中读取一个'unsigned int'''也会在多个层次上出现设计错误。最重要的是,进程A中映射的地址是由'mmap'返回给进程A的地址,*不是*进程B认为它是。其次,如果你的代码对性能至关重要,足以打扰共享内存,那么为你的IPC消息使用二进制序列化也是值得的。最后,[永远不要使用'scanf'做任何事情](https://stackoverflow.com/questions/15664664/scanf-regex-c/15664816#15664816)。 – zwol