如何使用像malloc这样的mmap?

问题描述

我正在尝试为列表结构的10倍分配内存,然后将其用于链接列表,但是我一直遇到分段错误

Valgrind

==3806== Invalid write of size 4
==3806==    at 0x4005FD: main (comp.c:14)
==3806==  Address 0xffffffffffffffff is not stack'd,malloc'd or (recently) free'd

示例代码

#include <sys/mman.h>

typedef struct list {
    int num;
    struct list *next;
}list;

int main()
{
    list *nodes = mmap(NULL,sizeof(list) * 10,PROT_READ | PROT_WRITE,MAP_PRIVATE,-1,0);

    nodes[0].num = 1;
    nodes[0].next = NULL;

}

解决方法

0xffffffffffffffff几乎肯定意味着mmap失败了。如果要使用它像malloc那样分配内存,则必须像对malloc一样进行错误检查,除了需要针对MAP_FAILED而不是测试返回的值NULL

失败可能是因为您试图映射不存在的文件描述符-1。仅当指定了MAP_ANONYMOUS标志(您未包含)时才允许这样做。