C语⾔中字符串的两种定义⽅式详解
⽬录
⽅式1
⽅式2
总结
我们知道C语⾔中是没有字符串这种数据类型的,我们只能依靠数组进⾏存储,即字符数组,⽽我们定义并且初始化数组有两种⽅式。下⾯将给⼤家介绍这两种⽅式并且介绍这两种⽅式的区别:
⽅式1
前两种是正确的定义⽅式,第⼀种之所以没有指定字符数组长度的原因是编译器能够⾃⼰推断出其长度,⽆需程序员⾃⼰设定,这也是我们⽐较推荐的⼀种定义⽅式,但注意内存长度编译器⼀经判定就⽆法再次更改,接下来我们分析⼀下第三种编译器为什么会出现乱码。
c语言定义一个字符串
相信⼤家都知道,字符串是以'\0'字符为结束标志的,这个标志本⾝也占⽤⼀个内存,我们在输出的时候是看不到这个字符的,这是由编译器所决定的,因为编译器的符本⾝占⽤了⼀个字节,所以sizeof()这个关键字在计算数组所占内存时要⽐字符多⼀个,如图中的arr1和arr2,⽽在计算arr3时,结果只有5,但输出和图⼆中我们所看到的却不⽌5个字符,那么这是为什么呢?
今天想给⼤家树⽴⼀个概念,我们在定义⼀个变量时,前⾯的类型加变量名实际上这是在内存中开辟了⼀个空间,变量所占内存的⼤⼩不是由变量的值所决定的,⽽时由我们最初开辟的空间的⼤⼩所决定的。这是⼀个很容易被⼤家忽视的⼀个⼩⼩的概念,希望⼤家能够牢记这⼀概念。
int a = 0;//在内存中开辟了⼀段4个字节的空间,然后将0的⼆进制补码形式(0的补码是其本⾝)放⼊到这段内存空间中
char b = 'c';//在内存中开辟了⼀段⼀个字节的空间,然后将字符'c'所对应的ascii码值所对应的⼆进制补码形式放⼊到这段内存空间中
//⾄于数组形式实际和这个是类似的,就是先开辟好数组所占的内存,然后将所要存储的数据的⼆进制补码形式放⼊到内存空间中
相信⼤家对上述原因已经有了属于⾃⼰的⼀些了解,接下来跟⼤家谈⼀下为什么数组arr3会输出乱码,'\0'是字符串的结束标志,但这个结束标志究竟有什么⽤呢?⽤处有两点,第⼀点是strlen函数在计算字符串所占内存空间时,遇到'\0'就会停⽌,进⽽能够求得字符串的长度(当然,这个计算不会把'\0'结束标志计算在内);第⼆点是编译器在执⾏printf函数时,以字符串形式进⾏输出字符数组时,遇到'\0'编译器就会停⽌输出,在arr3中,我们开辟的内存空间中放满了字符,没有字符串结束标志'\0',所以编译器会在把内存空间中的字符输出完并不会停⽌,还会继续进⾏输出,直到出现'\0'为⽌。
sizeof()计算的是变量所占的内存空间的⼤⼩,即红⾊框内的内存⼤⼩,也就是我们定义的⼤⼩,⽽strlen()计算的是从变量内存起始位置开始,⼀直向后进⾏计算,直到遇到结束标志'\0'为⽌,即上图中红⾊的框,下⾯给⼤家代码展⽰⼀下。
相信⼤家已经有所了解,这也能够⽅便我们更好的理解第⼆种定义⽅式所遇到的问题。
⽅式2
上述三种定义⽅式中1和3是正确的,⽅式2中并未把结束标志'\0'放⼊到数组最后⼀个空间中,这也是我们常犯的⼀个错误,希望⼤家要牢记,在采⽤这种⽅式对字符串进⾏定义时,
不要忘记加上字符串的结束标志'\0',因为编译器不会为程序员⾃动添加'\0',所以我们并不推荐这种⽅式来对字符串进⾏定义,除了加上'\0'之外,另⼀种⽅式就是限定字符串长度,限定之后编译器会在末尾加上结束标志'\0'(此处只是指的vs2019编译器,其它编译器笔者并未验证),当然,最推荐的还是程序员⼿动添加'\0'作为结束标志。
总结
本篇⽂章就到这⾥了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!