C语言学习005:不能修改的字符串

  一段有问题的代码,你能看出来么?

1 int main(){
2     char* msg="ABC";
3     msg[0]=msg[1];
4     puts(msg);
5     return 0;
6 }

  编译这段代码并不会有什么问题,一段运行程序就崩溃;因为这段代码修改了内存中常量区的值

  计算机将程序载入内存时,会把所有常数放到常量存储区,这部分内存是只读的

  为了更改字符串的内容,需要对它的副本进行操作,就是将字符串的内容复制到非只读区域就可以了

  那么这和之前的代码区又什么区别呢?在原来的代码中使用了指向只读区域的指针,我们通过指针去修改字符串的值,而指针所对应的字符串是在只读区域中的;而在后面的代码,我们是用字符串字面量初始化了一个数组,就是将只读的字符串复制到了非只读区域,这样对于这个副本我们就可以随意的去修改它了

  为了避免以后再犯修改只读区域的错误,我们可以在声明指针的时候加上const关键字,这样在编译的时候程序就能避免这种错误

  将指针赋值字符串字面量是没有错的,错的是去修改了它的值

转载于:https://www.cnblogs.com/liunlls/p/C_Const_String.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言字符串是由字符组成的数组。字符串C语言以null字符('\0')作为结束标志。C语言没有内置的字符串类型,但可以使用字符数组来表示字符串。使用字符数组可以进行字符串的操作和处理,比如拷贝、连接、比较等。 在数据结构字符串可以使用顺序存储结构(即字符数组)或链式存储结构(即链表)来实现。顺序存储结构是将字符串的字符顺序地存储在一维数组,通过下标来访问和修改字符串的各个字符。链式存储结构是通过链表的方式将每个字符存储在节点,并通过指针连接各个字符节点。 在字符串的操作,常用的操作有字符串的复制、拼接、比较、查找子串等。在C语言,可以使用标准库函数如strcpy、strcat、strcmp、strstr等来实现这些操作。另外,C++的std::string类也是对字符串操作的封装,可以更方便地进行字符串处理。 总之,对于学习C语言字符串和数据结构,可以通过学习字符数组的操作和使用标准库函数来实现字符串操作,进一步了解字符串的原理及在顺序和链表的实现。参考资料提供了关于字符串的原理及实现的详细内容,可以深入了解字符串的相关知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[简述]数据结构-字符串C语言实现)](https://blog.csdn.net/second60/article/details/80044985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c语言之数据结构实现的字符串](https://blog.csdn.net/weixin_45446903/article/details/97607846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值