问题描述
我正在尝试为列表结构的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
标志(您未包含)时才允许这样做。