我正在编写一个程序并获得了一个内存位置,我将其存储为unsigned int,并将映射的长度作为unsigned int,我想取消映射。
我的以下方法会生成警告:
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;
答案 0 :(得分:3)
我正在编写一个程序,并且已经获得了一个我已经存储为unsigned int的内存位置
不要那样做。使用void *
,char *
甚至[u]intptr_t
。不要将指针填入unsigned int
。那是错的。指针不是int
值,可能无法由int
正确表示,这就是您收到警告的原因。允许指针根据C标准转换为int
- 这就是为什么你得到警告而不是实际错误 - 但是不能保证转换回指针值会产生相同的地址。< / p>
和映射作为unsigned int 的长度,我想取消映射。
也不要这样做。使用size_t
:
typedef struct mapping{
void *startAddr;
size_t addrRange;
} mapping_t;
您不需要endAddr
,因为您有起始地址和大小。如果您需要结束地址,则需要将startAddr
转换为char *
以计算结束地址。
答案 1 :(得分:2)
你不能使用unsigned int作为指针。使用void *。
typedef struct mapping{
void * startAddr;
void * endAddr;
unsigned int addrRange;
}
mapping_t;