我正在读安德鲁·亨特和大卫·托马斯的“The Pragmatic Programmer”。 在第95页,在名为“Debugging”的部分中,作者写道:
“有时你会检查一个变量,期望看到一个小整数 值,而是得到像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)另外,我还想问一下哪些工具可以让你把“记忆社区”看作字符?
注意:请注意,保存值“Main”的内存地址(6e69614d)与我们在变量中找到的相同:0x6e69614d
答案 0 :(得分:2)
计数器是他们启动场景的小整数值。
这不是一个内存地址,它是一个十六进制的数字。它可能是内存地址,它可能是一个很大的数字,它可能是地址的第几个字符,如144和Main ...
至于工具,取决于你正在工作的环境。
您应该注意到,这类问题困扰着非托管环境中的开发人员,尤其是在使用C等故意松散的语言时
你需要的只是一个函数,它指的是一个指向字符串的指针,在某个地方你定义为16个字符长。
写入18个字符,你只是践踏了字符串之后的前两个字节。
像Pascal这样的更严格的语言,或者更现代的管理语言,会开始尖叫并向你大喊大叫。 请注意,事故发生这种情况要困难得多,这也意味着它更难以故意这样做,因此更现代化并不能自动转化为更好。