从变量中移除const-ness
Remove const-ness from a variable
本文关键字:const-ness 变量 更新时间:2023-10-16
我试图从变量(char*)中删除const-ness,但由于某种原因,当我试图改变值时,const变量的原始值仍然保持不变。
const char* str1 = "david";
char* str2 = const_cast<char *> (str1);
str2 = "tna";
现在str2的值改变了,但str1的原始值保持不变,我在谷歌上查了一下,但找不到一个明确的答案。
当使用const_cast并改变值时,const变量的原始值是否也要改变?
str1
的类型为const char*
。是char
是const
,而不是指针。也就是说,它是一个指向const char
的指针。这意味着你不能这样做:
str1[0] = 't';
这将改变其中一个const
char
s的值。
现在,当你执行str2 = "tna";
时,你所做的是改变指针的值。这很好。您只是将str2
更改为指向不同的字符串字面值。现在str1
和str2
指向不同的字符串。
使用非const
指针str2
,您可以执行str2[0] = 't';
-然而,您会有未定义的行为。您不能修改最初声明为const
的内容。特别是,字符串字面值存储在只读内存中,试图修改它们会给您带来可怕的灾难。
如果你想接受一个字符串字面值并安全地修改它,用它初始化一个数组:
char str1[] = "david";
这将把字符串字面值中的字符复制到char
数组。然后你可以根据自己的喜好修改它们
str2
只是一个指针。你的代码只是改变了指针的值,地址,而不是它所指向的字符串。
更重要的是,您试图做的事情会导致未定义的行为,并且很可能导致运行时错误。所有现代编译器都会将字符串"david"
存储在只读内存中。修改内存将导致内存保护错误。
相关文章:
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 如何检查函数是否真的获得了定义为 const 的变量?
- lambda捕获的const int变量的值类别
- 如何使用常量变量初始化类的 const 成员变量
- 静态对const局部变量有所作为
- 通过const成员变量访问内联函数
- 如何使用const成员变量设置数组大小
- 当不需要更改"const-ness"时,"const_cast"的效果是什么?
- 渲染循环无法访问 Assimp const 场景变量
- const参考变量初始化
- 在对象构造后初始化 const 成员变量
- 枚举和静态const成员变量在模板特征类中的用法
- 如何在另一个类中使用来自主类的全局const int变量
- 带有static/const的变量,在本例中使用
- 为什么用const char*变量构造类的未分配临时实例是错误的,而该类具有const char*constructor
- C++11中的Const成员变量
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- 为什么纯虚拟/抽象类需要构造函数,特别是对于受保护的const成员变量
- 从变量中移除const-ness