昨天看了阮一峰的公众号里面的一篇文章,说的是关于C语言的字符 串连接的问题,正好昨天不是很忙,就在vs code上测试了下,结果就出现问题了,跟作者想要表达的意思完全相悖,而且难以解释,并且相同的程序在虚拟机里跑的结果也不一样,今天特意加了个C的微信群,发群里了也没人回,特此记录一下,疑惑还未解决。
原文章链接地址:https://blog.holbertonschool.com/code-review-string-concatenation-in-c
01 原文大意
1 |
|
当代码执行到这里的时候,虚拟内存中的数据显示如下图所示(64-bit, Linux machine)
在执行了 a = aa; b = bb;后,数据存储如下:
在执行了第一个while循环之后,a指针指向了aa数组的最后
第二个while循环,就是出问题的地方,代码目的是将bb数组的数据拼接到aa数组的后面,图中显示的是循环12次后的结果(然而我本地只能循环两次,b就变成’\000’退出while条件了)
作者意思是,上述的操作中,我们可能改变了其他变量的值,或者在将数据写入一个我们并没有权限写入的地址,这个时候本来该报错的(Segmentation Fault),但在这个特殊的例子中,我们很幸运(也是不幸运,因为没有意识到我们已经犯了错误)的没有报错,并输出了想象中的结果。
但其实,我们的程序已经损坏了bb数组,结果如下
看起来我们是损坏了bb数组的数据,因为少了一个字符,但其实,bb在内存中还占据了相同的大小,只是内容被改变了,原因是因为在我们的代码中,aa数组和bb数组在内存中是分配在一起的,挨着的
程序结束后,bb数组的大小没有改变,内容改变了,第一个字符跑到aa数组的地盘了,bb数组的末尾有两个\0。
02 本地测试
debug了下,发现在*a = *b后;a和b的内存地址位置并不相同,而且a指向的数据中还有乱码,走了两个循环后,b就变为空了。
03 TODO
没学过C,希望有了解的能给解答下疑惑。