为什么 "garbage" 数据看起来没有意义?

Why does "garbage" data appear to not be meaningful?

我一直很奇怪为什么垃圾数据看起来没有意义。为清楚起见,我所说的 "garbage" 是指恰好位于特定内存地址的数据,您可以访问这些数据是因为忘记初始化变量。

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

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

显然,这对我的应用程序没有用,但它似乎对任何应用程序也没有任何用处。为什么是这样?也许这里正在进行某种数据保护?

正如您在问题中所说:

... "garbage" is data that is just whatever happens to be at a particular memory address, that you have access to because of something like forgetting to initialize a variable.

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

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

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

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

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