我正在尝试从变量(char *)中删除const-ness,但由于某种原因,当我尝试更改该值时,const变量的原始值仍然保持不变。
const char* str1 = "david";
char* str2 = const_cast<char *> (str1);
str2 = "tna";
现在str2的值发生了变化,但是str1的原始值保持不变,我在Google上查了一下,但找不到明确的答案。
当使用const_cast并更改值时,const变量的原始值是否也会发生变化?
答案 0 :(得分:10)
str1
的类型为const char*
。 char
是const
,而不是指针。也就是说,它是指向const char
的指针。这意味着你不能这样做:
str1[0] = 't';
这会改变其中一个const
char
的价值。
现在,当你执行str2 = "tna";
时你正在做的是改变指针的值。没关系。您只是将str2
更改为指向不同的字符串文字。现在str1
和str2
指向不同的字符串。
使用非const
指针str2
,可以执行str2[0] = 't';
- 但是,您有未定义的行为。您无法修改最初声明为const
的内容。特别是,字符串文字存储在只读内存中,尝试修改它们会给你带来可怕的不幸。
如果你想获取一个字符串文字并安全地修改它,用它初始化一个数组:
char str1[] = "david";
这会将字符串文字中的字符复制到char
数组。然后你可以根据自己的喜好修改它们。
答案 1 :(得分:3)
str2
只是一个指针。而你的代码只是改变了指针的值,地址,而不是它指向的字符串。
此外,您尝试执行的操作会导致未定义的行为,并且很可能会导致运行时错误。所有现代编译器都会将字符串"david"
存储在只读内存中。尝试修改该内存将导致内存保护错误。