将 const char* 转换为 char*
Posted
技术标签:
【中文标题】将 const char* 转换为 char*【英文标题】:Convert const char* into a char* 【发布时间】:2021-04-10 09:02:29 【问题描述】:当我声明和定义一个 char* 变量时,我总是想知道编译器的抱怨。
char* myChar = "Char";
编译器会抱怨它无法。它需要像
这样的显式转换char* myChar = (char*)"Char";
我的第一个问题是,这是否是用 const char* 初始化 char* 的正确方法。我的第二个问题是,为什么编译器需要这种显式转换。我认为 const char* 和 char* 除了 const 没有太大区别。
【问题讨论】:
const
是的最大区别。指向某些非 const 限定类型的指针和指向 const 限定类型的指针是不同的、不相关的类型。
没有用const char*
初始化char*
的“正确”方法。一个是指向可变数据的指针,另一个是指向不可变数据的指针。您可以将前者隐式转换为后者;您正在玩从后者到前者的强制转换,尤其是如果您“认为 const char* 和 char* 之间没有太大区别”。
试试这个:char* myChar = (char*)"Char"; myChar[0] = 'x';
kaboom!
@rustryx 很好的例子。我认为 memcpy 可以避免这种情况。
【参考方案1】:
在技术层面上,const MyType*
和 MyType*
之间存在很大差异,在您的示例 char* myChar = "Char";
中更容易看到,因为乱码字符串可以是可能无法更改的内存的一部分,但是通过将其分配给非常量指针,您说您可能会计划更改某些字符。这种行为是未定义的。它可能会起作用,它可能会使您的程序意外停止,您甚至不能排除任何其他行为。
通过强制转换(更喜欢 C++ 中的 const_cast
),您是在对编译器说您知道自己在做什么,而且您知道得更多。如果您不打算指向其他 char 数组,正常的解决方案是 const char* myChar = "Char";
甚至是 const char* const myChar = "Char";
。
在 C++ 中,如果您想使用字符串,我发现使用 std::string
会更加清晰。
【讨论】:
现在我明白了。我的文字“Char”被放置在固定的 EXE 的 .data 部分中。 const char* ... 指向这个 .data-section 地址,还是? 是的。顺便说一句,允许编译器将文字字符串放在非常量数据中并重复使用它的多种用途,因此在这种情况下,如果您覆盖一个,即使在稍后声明时,所有其他字符串也会给出新值使用的功能。这也是可能的未定义行为。最常见的是,它位于数据部分中,更新将导致程序停止。【参考方案2】:对于高级程序员来说,在完整性、安全性和性能方面,const 和非常量之间肯定存在很大差异。 当我们想要强调不允许用户更改特定对象/函数/变量时,我们基本上使用 const。
查看const correctness
添加/删除 const/volatile 修饰符的最佳实践方法是使用 const_cast 运算符。
检查The const_case operator
【讨论】:
以上是关于将 const char* 转换为 char*的主要内容,如果未能解决你的问题,请参考以下文章
从 unsigned const char * 类型转换为 char const *