空指针deference和未初始化的内存属于内存损坏

时间:2017-03-29 12:53:59

标签: c memory memory-management

在维基百科中,memory corruption的定义如下:

  

当计算机程序的内容出现内存损坏时   由于编程,内存位置被无意修改   错误;这被称为违反记忆安全。

但是在随后的描述中,空指针取消引用和未初始化的内存被认为是内存损坏。

我有点困惑。空指针取消引用和未初始化的内存不会无意中修改内存位置的内容。为什么他们被视为记忆腐败?

2 个答案:

答案 0 :(得分:4)

"内存损坏"这不是一个正式的术语,所以去寻找一个正式的定义并不是很有意义。此外,维基百科不一定是规范的信息来源。

空指针访问可能会也可能不会导致内存损坏。这主要取决于系统是否允许写入地址0或不是 1)

同样地,使用未初始化或"悬挂"指向任何随机位置的指针都可能导致任何类型的行为,包括内存损坏。

这些都属于正式术语未定义行为,这意味着如果您调用此类行为,任何事情都可能发生。

1)理论上,C语言禁止编译器为空指针提供一个地址,该地址可能对应于目标上的实际地址。在实践中,编译器通常不会这样做但只使用地址零。这是许多微控制器系统或其他允许直接访问物理内存的计算机上的有效地址。

答案 1 :(得分:0)

取消引用空指针引用不能破坏内存,除非第一页映射到进程地址空间。

默认情况下,大多数操作系统都不会映射此页面(尽管许多操作系统允许用户在选择时映射它)。

因为空指针不会引用任何内容,所以不能通过访问它来破坏任何内容。

如果指针本身具有null(或任何其他无效值),则它本身可能已损坏。