写在前面
字符串常量和字符数组,平时极易遇到的问题。我在将字符类型的16进制转换为int型十进制时,又遇到这个老朋友。且看一一分解。
一、赋值方式不同,长度有区别
char a[] = "abc";
char b[] = { 'a','b','c' };
这两种方式都可以给字符数组赋值。一种使用字符串常量,一种用的单个字符赋值。但实际上,a偷偷带了一个小尾巴’\0’,这是因为字符串常量总是以’\0’结尾的
所以a的实际长度是4,b的实际长度是3。sizeof函数
二、字符串常量如何赋值给字符数组
常用的方式好说,那常量在赋值到字符数组时,是把常量区的内容复制到栈中的。根据C程序存储空间布局可得,有正文段、data段(已赋值的数据)、bss段(未赋值的数据)、堆、栈。
“abc”属于常量,是存放在data段的,而在main函数中声明的a[]是存放在栈空间的,第一种赋值方式是将“abc”的内容复制到栈中a的地址空间的,所以连带着’\0’一起复制。
这也是为什么只能在声明时使用这种方式赋值。如果是以下这种方式,则报错。