【问题标题】:Understanding memory allocations and pointers in c [duplicate]了解c中的内存分配和指针[重复]
【发布时间】: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


【解决方案1】:

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

另见接受的答案here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多