如何像malloc一样使用mmap?
How to use mmap like malloc?
我正在尝试为我的列表结构的 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
标志时才允许,而您并未包含该标志。
我正在尝试为我的列表结构的 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
标志时才允许,而您并未包含该标志。