C/C++编程-语言陷阱-字符串

前言

要说C语言的精髓,想必大家第一印象都会想到指针。那么第二是谁呢,目前的我认为是本篇的主角“字符串”。接下来就说一说原因。

定义

字符串有三种定义方式:

string str1 = "hello world A";
char *str2 = "hello world B"
char str3[] = "hello world C"

不要扯宏定义,咱们就说变量。
str1和str2 都是静态常量区。是和程序一起编译后,存储到只读区域的。因此C++官方也建议 定义应该写成 const char *str2 = “xxx”,且必须要初始化。
可见官方的设定意愿就是,字符串就是一组规划好的只读字符表。就像以前我们写LED显示的时候,总是取模工具,保存字符表,然后一个.C文件保存为const char []={};一样。
那么具体感受一下细节:

char * p1 = "hello world" ;
    char * p2 = "hello world" ;
    char * p3 = "hello worldn"  ;
    printf("%p \n" , p1)  ;
    printf("%p \n" , p2)  ;
    printf("%p \n" , p3)  ;

输出结果

0000000000409003
0000000000409003
000000000040900f

可见字符串被保存到静态常量区后,再次出现都是从静态常量区直接读取。“官方保管了这个字符表”

套用知乎上一位大哥的回答“字符串字面量存储到.rodata节中,该节一般位于代码段,在应用程序装入(exec调用)时该段所在页会被标记为不可写(同时不可执行)。试图写它时会触发segmentation fault,进程不可屏蔽的强制退出信号。另外,在单片机上,该段一般会被装入可随机寻址(可执行代码)的ROM(只读存储器)中,从硬件上就无法直接写。在不存在随机寻址ROM(即所有程序都被复制到RAM中再运行),且没有页表映射和内存保护的系统上,没有任何机制能够阻挡你修改它了,不止这个,动态修改代码也没人管得了。”----[link]https://www.zhihu.com/question/65756326
其实仔细琢磨就明白另外一位大哥的疑问了(结合我描述的词汇):
“为啥char *s;

s不malloc就可以直接用了啊,困惑好久了,存储在哪里啊?是不是跟这个类似?

用的时候会把已分配的空间的指针给s??

如果再写一句s =“aaaa”;

发生了什么啊?跟问题的char *s="aaaa"差别在哪啊??”

另外,既然前两个“字符串变量”已然被官方定义为了“字符串常量”,那么真正的字符串变量怎么用呢?就是第三种定义方式,只是这种方式有一个大家都知道要注意的细节,自己添加结束符“/0”。

操作

应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值