【发布时间】:2019-01-07 06:25:44
【问题描述】:
我有
x=(int *)malloc(sizeof(int)*(1));
但我仍然可以阅读 x[20] 或 x[4]。
我如何能够访问这些值?我不应该在访问这些内存时遇到分段错误吗?
【问题讨论】:
-
当您的程序有未定义的行为时,不要期望任何可预测的事情。
-
用户空间中没有内存防护。您正在访问的是由其他一些用户空间程序分配的内存。它不会导致你的程序直接崩溃,但你会得到意想不到的结果。
-
@SoumyaKanti 这不是任何现代操作系统的工作方式......不同的用户空间程序生活在不同的虚拟地址空间中,所以他绝对不会从另一个用户空间程序访问内存。更有可能的是,他只是在访问他的进程堆(或属于堆数据结构的数据)的下一个(可能已分配,可能未分配)块。
-
作为一个实用的解释为什么它经常不会出错,大多数当前的主流硬件架构只能对整个
page内存强制执行访问权限。如果一个进程对页面的任何部分具有写访问权,那么它对整个页面具有写访问权,并且页面可能类似于 4096 字节,因此给出的示例可能不会跨越页面边界。但那是计算机 - 就 C 标准所说的而言,你正在做的事情是未定义的,从你的显示器中飞驰而出的独角兽并不比任何其他结果更非法。 -
@SoumyaKanti:关键是,如果您要提供详细信息,则必须提供正确详细信息,或者根本不提供;我见过很多人因为“善意的谎言”被“帮助”分发而头脑中出现奇怪的困惑。对于初学者来说,好的解释可能会在困难的方面进行简化,但即使在专业人士的眼中也仍然完全正确。至于在进程之间没有内存隔离的操作系统,那是非常古老或专门的东西,鉴于他正在谈论段错误,很可能不是 OP 使用的。
标签: c malloc dynamic-memory-allocation