字符串字面量声明定义赋值给指针与数组的差异分析

本文解析了字符串字面量在C语言中为何不可修改,及为何通过指针尝试修改会失败,而通过数组则可行。深入探讨了常量存储区与栈区的区别,以及编译器如何处理字符串字面量和数组变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串字面量声明定义赋值给指针与数组的差异

字符串字面面量不能被修改,这是铁理!那么问题来了?为什么

char *p="abc";

*p='d';//(wrong!)

char p2[]="abc";

p2[0]='d';//(right!)

这是为毛?为毛啊?不是说好的常量不能被修改吗?char *p="abc"是常量?没有const啊!那为什么p2[0]='d'正确 ,*p='d'错误?

且听我娓娓道来,首先需要知道一点,“abc”属于字符串字面量(字符串常量),“字符串字面量不允许被修改”存储在常量存储区,无法被修改。

①char *p="abc"指针变量p指向字符串”abc”的第一个字符,即p等于”abc”字符串中’a’的地址,当*p='d',即要将地址为p存储的值由原来的’a’修改为’d’,如此”abc”便会变成”dbc”,由于“字符串字面量不允许被修改”,因此编译器会判定*p='d'为wrong。

 

②而char p2[]="abc"由于字符串变量的声明可以省略它的长度,在这种情况下编译器会自动计算长度,编译器会为p2分配4个字符的空间,这足够存储“abc”的字符和一个空字符。看清楚了!编译器会为p2分配4个字符的空间!,这个时候就产生了两个地址块(次说话自己造的),一个地址块是存储字符串字面量“abc”的连续地址(在常量存储区中),另一个是编译器会为p2分配4个字符的空间(栈区)。接下来用图来表示。

如图所示,char p2[]="abc"是通过类似于值传递的过程,将’a’,’b’,’c’,’\0’四个字符传递到编译器会在栈区为p2分配4个字符的连续地址空间中,如此由于栈区数据可读可写,即可以修改,p2[0]='d';即编译器允许将栈区的’a’修改’d’。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值