存储在未使用的内存空间中的值是什么?

问题描述 投票:1回答:2

我使用mmap()从/ dev / zero分配4096长度的内存空间,我发现我仍然可以从这个空间中访问内存(例如,start_pt是指向空间的指针,我可以打印出值* start_pt + 8192没有任何分段错误)。存储在越界区域的值似乎是随机的。

有没有人知道这些值是什么以及为什么我可以访问它们?

c mmap virtual-memory
2个回答
1
投票

在某些时候,您的进程中的其他内容从操作系统请求内存。如果不检查您的具体流程,通常无法说出什么。候选人包括:

  • 程序启动时,加载程序为代码,常量数据,堆栈等设置内存。此外,为您的程序(可能是命令行shell)创建新进程的进程可能在内存中有一些通过执行新程序的过程保留的内容。 (例如,我不确定命令行参数是直接从父级继承的,还是由通过某些进程间通信接收它们的启动代码获得的。)
  • 当你的程序的启动代码正在运行时(由加载器启动并在调用main之前设置C环境的代码),它可能已经为各种目的请求了内存(准备文件缓冲区,为malloc初始化内存池)和其他东西),包括它自己的计算。
  • 如果你在mmap之前调用任何例程,他们可能已经请求了内存。例如,当你打开文件时可能会创建缓冲区,printf会为它需要执行的格式化操作准备一些工作空间,而malloc需要额外的内存来保存自己的记录,除非它返回给你。

从本质上讲,除了您在普通C代码中观察到的内容之外,内存中还会发生各种各样的事情。


0
投票

未使用的内存未映射到进程地址空间。如果你可以访问内存,这意味着某些内容已使用mmap(或等效内容)映射内存。如果内存未使用,则无法访问它。

© www.soinside.com 2019 - 2024. All rights reserved.