0
点赞
收藏
分享

微信扫一扫

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


刚在网易云翁恺老师的课堂上刚学到了一些很神奇的东西,感觉受益匪浅,因此特意总结一下,让更多的人知道。

大家先看这样一张图

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

学过c语言的人肯定知道,造成这种结果的原因是数组越界了,因为定义了大小为8的字符串数组,最多存放的有效字符是7个,而输入的却是8个,但是为什么却只有第一个word没有输出内容而第二个word1却成功输出了呢?

因为,在c语言中,不同数组是成栈存放的,即先进后出,一般是由高地址向低地址生长,也就是说我们开辟的word的地址标号要比word1的地址标号要高。

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

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

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

接下来一张为没有越界的

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

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

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

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

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

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


举报

相关推荐

0 条评论