前言
要说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”。
操作
应用
|