变量或常量修改你不知道的奥秘 变量或常量修改你不知道的奥秘是什么

liftword7个月前 (12-17)技术文章82

有些变量其实可能是常量,修改将产生一些不预期的结果。

字符串修改

  • C语言字符串char *变量本质是指针, 如果是字面量初始化,存放位置可能位于只读区,修改内容将产生崩溃。
    • char s[] = "hello"与char *s = "hello"截然不同,前者一定可修改,而后者不一定。反汇编这两段代码,能看到区别在于后者会直接取指针赋值,前者会有拷贝或初始化动作。
    • 编译器如果把字符串字面量放在.rodata区,程序运行后对应内存页面就是只读的,写此区域将发生内存异常。
    • C修改字符串字面量的行为是未定义的。
    • 另外上面数组s是常量,不能再被赋值。


  • C++标准明确指出字符串字面量是const类型。C++修改字符串字面量的行为一定会出错。
    • 对于string str = "abcd"赋值的变量允许修改,str构造时有申请空间保存"abcd".


  • Java string是常量,StringBuilder和StringBuffer是可修改的,StringBuffer是线程安全,访问起来可能更慢。


  • C# string和Java一样是常量,StringBuilder是可修改的。
  • Java和C#把string默认当常量,其实是为了优化,常量可以提前优化在某个地址,这和C/C++字符串char *字面量可能被优化是类似的。
  • C++ string不像C#和Java那样,它默认可修改。






若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关文章

解析Python中的上下文管理器 python上下对齐

在传统编程语言中,Java经常用全局static final来处理静态变量和常量,Python中也有用于处理上下文管理器的工具,它就是with。我们在一些Python文件操作中,经常看到with的使用...

. Python 中的元组 python中的元组和列表的区别

元组是 Python 中的一种内置数据结构,可用于存储项目的有序集合。与列表类似,元组可以在单个实体中保存多种数据类型,但它们是不可变的,这意味着一旦创建,就无法修改、添加或删除元素。此属性使 Tu...

Python学习 -- 枚举类 python中的枚举的定义

当谈到在Python中管理一组常量或者枚举类型的时候,Enum(枚举)类是一个非常有用的工具。Python的Enum类允许你创建具有有意义的、可读性高的常量集合,而不必使用硬编码的数字或字符串。在本篇...

Python GUI 编程:tkinter 初学者入门指南——几何布局管理器 pack

Tkinter 可以使用几何布局管理器来组织窗口上的小部件。Tkinter 支持三种几何布局管理器:packgridplace在本文中,将介绍 Tkinter 的几何布局管理器 pack 以及如何使用...

“挑战用 500 行 Python 写一个 C 编译器”

作者 | Theia Vogel 译者|Ric Guan 责编 | 屠敏出品 | CSDN(ID:CSDNnews)几月前,在挑战用 46 行 Python 写有符号距离函数(Signed Dista...