mmap()导致C中的分段错误

问题描述 投票:0回答:1

我很确定我的错误很明显,但是我似乎找不到问题所在。我正在学习如何在C中使用mmap(),对我来说一切都正确,但是出现了段错误。

这是我的代码:

int n=50;
char * tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0);

for(int i=0; i<n; i++)
{
   tab[i] = 1;
}

[使用valgrind,我在执行tab[i]=1的行上收到一条错误消息,提示“无效写入1号”,(我尝试将1替换为'1',因为认为char的大小比int小,但仍然会出现相同的错误),其次是“地址0xfffff..ff没有被堆栈,malloc或(最近)被释放”。

我不知道我的错误在哪里?请帮助!

c memory-management segmentation-fault valgrind mmap
1个回答
0
投票

来自man 2 mmap

文件映射的内容(与匿名映射相反;请参见下面的man 2 mmap),使用MAP_ANONYMOUS字节开头进行初始化在文件所引用的文件(或其他对象)中的偏移量length处文件描述符offset

我想您正在尝试创建匿名映射(即不受文件支持)。在这种情况下,您需要fd添加到MAP_ANONYMOUS,否则系统将尝试从指定的flags读取,该值无效(fd),并且将失败。

正确的代码是:

-1

为了将来,请注意,您可以像在上面的操作中一样,在char * tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (tab == MAP_FAILED) { perror("mmap"); exit(1); } 之后使用简单的perror("mmap")轻松检测到错误,在您的情况下,应打印以下内容:

mmap()

再次查看手册,您可以在“错误”部分中看到:

EBADFmmap: Bad file descriptor 不是有效的文件描述符(并且未设置fd)。

© www.soinside.com 2019 - 2024. All rights reserved.