关于c的字符串的一些小细节以及c在计算机里数组的内存存放

来源:互联网 发布:淘宝店铺代运营协议书 编辑:程序博客网 时间:2024/05/16 15:18
刚在网易云翁恺老师的课堂上刚学到了一些很神奇的东西,感觉受益匪浅,因此特意总结一下,让更多的人知道。

大家先看这样一张图这里写图片描述

学过c语言的人肯定知道,造成这种结果的原因是数组越界了,因为定义了大小为8的字符串数组,最多存放的有效字符是7个,而输入的却是8个,但是为什么却只有第一个word没有输出内容而第二个word1却成功输出了呢?因为,在c语言中,不同数组是成栈存放的,即先进后出,一般是由高地址向低地址生长,也就是说我们开辟的word的地址标号要比word1的地址标号要高。

这里写图片描述

而在一个数组内部,地址排列是自下而上的,即从标号低的地址向标号高的地址排列,因此,word1[7]上面紧跟着的是word[0](即word1的最后一项紧跟word的第一项)。因此,当用户输入12345678的时候,会造成本应该在word1[7]的'\0'却跑到了word[0],造成程序理解word为空字符串(因为在字符串操作里面,'\0'代表字符串终止,因此无论word后面有没有内容都会截止。)

这里写图片描述

接下来一张为没有越界的

这里写图片描述

因此这种读入是不安全的,所以你需要限定用户读入的有效字符个数,即scanf(“%7s”,&word);

这里写图片描述

但是大家不要误解,scanf函数依然是读到空格、tab或回车为止,%7只是限制了读入的有效字符个数。

这里写图片描述

好了,以上即为本菜鸟(真的是菜鸟)在翁恺老师的视频中所学到的,真心感到翁恺老师讲的很不错。如果有错误的地方或者误解欢迎各位大佬指出!~

原创粉丝点击