为什么“垃圾”数据似乎没有意义?

时间:2015-05-04 23:25:26

标签: debugging memory garbage

我一直想知道为什么垃圾数据似乎没有意义。为清楚起见,我所说的“垃圾”是指在特定内存地址处发生的任何数据,您可以访问,因为忘记初始化变量。

例如,打印出一个未使用的数组给了我这个:

@°õN)0ÿÿl¯ÿ¯ÿ ``¯ÿ¯ÿ  @`¯ÿø+))0 wy¿[d

显然,这对我的应用程序来说没用,但它似乎对任何应用程序都没有用。为什么是这样?这里是否有某种数据保护?

2 个答案:

答案 0 :(得分:1)

正如您在问题中所述:

  

...“垃圾”是指在特定内存地址发生的任何数据,您可以访问,因为忘记初始化变量。

这意味着在你将它用于你的变量之前,其他东西曾经存在于那个内存中。无论过去是什么,可能会或可能不会与您希望如何使用变量有任何关系。也就是说,大多数语言不会强制将用于某种类型对象的内存重用于完全相同的类型。

这意味着,如果内存用于存储指针,然后释放,则可以使用相同的内存来存储字符串。如果指针值被读出就好像它是一个字符串,那么看起来像垃圾的东西可能会出现。这是因为用于表示指针值的字节不限于与可打印ASCII值对应的值。

在程序中检测缓冲区溢出的常用方法是检查指针值并查看它是否包含可打印的ASCII值。在这种情况下,作为指针的内存用户看到垃圾,但在这种情况下它是“可打印的”。

答案 1 :(得分:1)

当然记忆永远不会是垃圾,除非你做出有意识的努力。毕竟,你是一个确定性的机器,即使它看起来并不总是这样。 (当然,如果你将任意字节解释为文本,那么你不太可能认为自己是ASCII艺术,尽管你应该得到它。)

这就是历史上最严重的错误之一的原因,最近,参见https://xkcd.com/1354/。你住在哪里错过了它?