【发布时间】:2019-01-28 23:01:36
【问题描述】:
我正在努力加深对操作系统的理解。我的 Linux 系统使用 4096 字节的页面大小。我是通过运行命令得到的:
[root@localhost]# getconf PAGESIZE
4096
我也知道页是最少可寻址的内存单元。所以我尝试创建分配: 4096 字节的 char 指针,我开始初始化如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p = malloc(4096*sizeof(char));
for(int i = 0 ;i< 4099;i++)
{
p[i] = 'c';
}
printf("Hey there!\n");
return 0;
}
我知道字符也是 1 字节大小。
这是我不明白的,为什么程序没有段错误,它应该已经用完了分配给它的一页!
这不是一个重复的问题,其他问题是关于在没有页面大小上下文的情况下传递数组寻址的结尾,就像我在这里一样。
根据我的理解,我的指针 p 应该只能访问我分配的内存大小为 4096 字节的一页。如果我分配了 5000 字节,那么它将有 2 页,对吗?
【问题讨论】:
-
4099超出数组范围 -> 未定义行为 -
感谢您的提问。首先,这是未定义的行为,因此实现可以随意做任何事情。也就是说,实际上,不能保证您分配的缓冲区是在页面边界上分配的。内部 C 库/运行时中的某些内容可能已经分配了一些内存,因此您对
p的分配最终跨越了页面边界,或者幸运的是,p[4099]是您通过写入它而损坏的其他一些内存. -
这确实是重复的,有数百个问题在询问为什么程序在 OP 认为它“应该崩溃”时幸存下来。
-
您不是在与您的操作系统对话,而是在与
malloc对话。malloc没有页面的概念。 -
这两个链接都不是很好的重复。他们没有解决页面问题。
标签: c pointers memory-management alloc