细节2:字符数组和字符串常量是一样的吗?

写在前面
字符串常量和字符数组,平时极易遇到的问题。我在将字符类型的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’一起复制。

这也是为什么只能在声明时使用这种方式赋值。如果是以下这种方式,则报错。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值