我正在努力加深对操作系统的了解。我的Linux系统使用4096字节的页面大小。我是通过运行命令得到的:
[root@localhost]# getconf PAGESIZE
4096
我还知道页面是寻址最少的存储单元。因此,我尝试创建精确的分配:为char指针分配4096个字节,然后开始初始化,如下所示:
#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;
}
我知道chars也为1字节大小。
这是我不了解的内容,即使程序没有分段故障,它也应该已经用完分配给它的一页!
这不是重复的问题,其他问题是关于在没有页面大小上下文的情况下通过数组寻址的结尾的问题。
据我了解,我的指针p应该只能访问分配了4096字节的一页内存。如果我分配了5000个字节,那么它将有2页,对吗?
答案 0 :(得分:4)
您的问题可能与页面大小无关。当您使用malloc(PAGE_SIZE)时,不能保证在页面开始时就开始分配数据,因为这不是堆分配的工作方式。正如其他人提到的那样,您的结果将是不确定的,因为就像您超出数组边界的任何情况一样。
另请参阅接受的答案here