我在读Andrew Hunt和David Thomas合著的《The Pragmatic Programmer》。在第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 2n
看起来有人在我们的柜台上喷了一个街道地址。现在我们知道去哪里找。"
我不能完全理解这个例子。
1)作者在这种情况下使用"counter"是什么意思?
2)为什么如果有人在那里喷了一个街道地址,在我们的变量中我们应该看到内存地址而不是值"Main"?
3)在成瘾方面,我还想问一下,哪些工具可以让你作为角色查看"记忆邻居"?
注:请注意,保存值:"Main"的内存地址(6e69614d)与我们在变量0x6e69614dCounter是他们在场景开始时使用的小整数值。
那不是一个内存地址,它是一个十六进制的数字。它可以是内存地址,它可以是一个大数字,它可以是地址的几个字符,如144和Main…
至于工具,取决于你在什么环境下工作。
您应该注意到,这类问题困扰着非托管环境中的开发人员,特别是在故意使用像C
这样的松散语言时。你所需要的只是一个函数,它接受一个指向字符串的指针,这个字符串在某个地方被定义为16个字符。
给它写18个字符,你只是践踏了字符串后面的前两个字节。
像Pascal这样更严格的语言,或者更现代的管理语言,会开始对你大喊大叫。请注意,无意中做到这一点要困难得多,也意味着有意做到这一点要困难得多,所以更现代并不会自动转化为更好。