c - 我如何知道我的 mmaped 分配的范围?

标签 c memory memory-management malloc mmap

我正在使用 mmap 创建一个匿名映射,12 个字节(我知道的很小)

p = mmap(NULL,
        12,
        PROT_READ| PROT_WRITE,
        MAP_ANONYMOUS | MAP_PRIVATE,
        -1,
        0);

然后我想验证我是否可以写超过这12个字节

p=p+13;
strcpy(p,str);
printf("String at p is %s\n", ((char *)p));

果然可以读写这个区域了。我尝试通过将指针递增 20,000 来跨过 ~5 页。我系统上的页面大小是 4096。我使用 sysconf(_SC_PAGESIZE) 发现了这一点。我仍然可以读写指针

这是怎么回事?我是在做错什么,还是有一些我还没有达到的 glibc 限制?

编辑:为了验证,我希望我的代码失败,超过某个限制,但我无法意识到该限制在哪里

最佳答案

对于较小的增量,您只会看到虚拟内存按页面组织的事实。页面大小是可以分配给进程的最小内存增量。

对于较大的增量,您可能只是遇到了为其他目的分配的页面,例如堆、堆栈或其他文件的映射。

关于c - 我如何知道我的 mmaped 分配的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539763/

相关文章:

java - 来自配置文件或 .java 的巨大数组

c++ - 创建新对象时使用 `new classObject` 和 `&classObject` 有什么区别?

python - 按列组合 CSV 文件

C 字符串搜索获取字符串的一部分

C - 构造函数,返回结构更好还是指向结构的指针更好?

iOS NSURLConnection(sendAsynchronousRequest :) too much cache

visual-studio - 输出窗口中的错误 - Managed' 已退出,代码为 -2147023895 (0x800703e9)

c - 为什么调用函数时会有开销?

c - 避免在 C 中嵌套多个 if 语句

C:在空堆中插入元素