解决munmap警告消息

时间:2017-06-05 17:00:12

标签: c memory-management mmap

我正在编写一个程序并获得了一个内存位置,我将其存储为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;

2 个答案:

答案 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;