IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++编程-语言陷阱-字符串 -> 正文阅读

[C++知识库]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”。

操作

应用

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:28:26  更:2021-12-09 11:28:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:53:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码