2

我正在阅读 Andrew Hunt 和 David Thomas 的“实用程序员”。在第 95 页,在名为“调试”的部分中,作者写道:

“有时你会检查一个变量,期望看到一个小的整数值,而不是得到类似 0x6e69614d 的东西。在你卷起袖子进行一些严肃的调试之前,快速查看一下这个损坏的变量周围的内存。通常它会给你一个线索。在我们的例子中,检查周围的记忆作为字符向我们展示:

20333231 6e69614d 2c745320 746f4e0a
  1 2 3   M a i n    St,    \n No t
2c6e776f 2058580a 31323433 00000a33
 o w n ,  \n X X   3 4 2 1  2\n\0\0

看起来有人在我们的柜台上喷了街道地址。现在我们知道去哪里找了。”

我不能完全理解这个例子。

1)在这种情况下,作者所说的“计数器”是什么意思?

2)为什么如果有人在那里喷洒街道地址,在我们的变量中我们应该看到内存地址而不是值“Main”?

3)上瘾,我还想问一下,哪些工具可以让你把“记忆邻居”看成角色?

注意:请注意内存地址(6e69614d),其中值:“Main”被保存,与我们在变量中找到的相同:0x6e69614d

4

1 回答 1

2

计数器是他们开始场景的小整数值。

那不是内存地址,而是十六进制的数字。它可能是内存地址,可能是一个大数字,也可能是地址的几个字符,如第 144 位和 Main...

至于工具,取决于您工作的环境。

您应该注意到,这类问题困扰着非托管环境中的开发人员,尤其是在使用像 C 这样故意松散的语言时

您所需要的只是一个函数,该函数接受一个指向字符串的指针,该字符串在某处您已定义为 16 个字符长。

向它写入 18 个字符,你只是践踏了字符串后面的任何内容的前两个字节。

更严格的语言,如 Pascal,或更现代的管理语言,将开始对你大喊大叫。请注意,偶然做到这一点要困难得多,也意味着故意这样做要困难得多,因此更现代并不会自动转化为更好。

于 2013-01-17T09:07:07.780 回答