了解 c 中的内存分配和指针

Understanding memory allocations and pointers in c

我正在努力加深对操作系统的理解。我的 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 页,对吗?

您的问题可能与页面大小无关。当你 malloc(PAGE_SIZE) 时,你不能保证你的数据在页面的开头开始分配,因为这不是堆分配的工作方式。正如其他人提到的那样,您的结果将是不确定的,因为它就像您超出数组边界的任何情况。

另请参阅已接受的答案here