从变量中移除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*。是charconst,而不是指针。也就是说,它是一个指向const char的指针。这意味着你不能这样做:

str1[0] = 't';

这将改变其中一个const char s的值。

现在,当你执行str2 = "tna";时,你所做的是改变指针的值。这很好。您只是将str2更改为指向不同的字符串字面值。现在str1str2指向不同的字符串。

使用非const指针str2,您可以执行str2[0] = 't'; -然而,您会有未定义的行为。您不能修改最初声明为const的内容。特别是,字符串字面值存储在只读内存中,试图修改它们会给您带来可怕的灾难。

如果你想接受一个字符串字面值并安全地修改它,用它初始化一个数组:

char str1[] = "david";

这将把字符串字面值中的字符复制到char数组。然后你可以根据自己的喜好修改它们

str2只是一个指针。你的代码只是改变了指针的值,地址,而不是它所指向的字符串。

更重要的是,您试图做的事情会导致未定义的行为,并且很可能导致运行时错误。所有现代编译器都会将字符串"david"存储在只读内存中。修改内存将导致内存保护错误。