【问题标题】:Convert const char* into a char*将 const char* 转换为 char*
【发布时间】:2021-04-10 09:02:29
【问题描述】:

当我声明和定义一个 char* 变量时,我总是想知道编译器的抱怨。

char* myChar = "Char";

编译器会抱怨它无法将 const char* 转换为 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 可以避免这种情况。

标签: c++ char


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多