【问题标题】:Why is it possible to change chars in chars array, and impossible with char *?为什么可以更改 chars 数组中的字符,而使用 char * 则不可能?
【发布时间】:2013-03-22 12:00:44
【问题描述】:

如果我声明一个字符数组 (char str[]),我可以更改其中的任何字符。 但是,如果我像这样声明该数组 - char* str="abcd"; 它不可能更改内部的任何字符。 这是为什么?他们不应该是同一个东西吗?

【问题讨论】:

  • 为什么说这是不可能的?你有任何错误吗?

标签: c++ arrays char


【解决方案1】:

当你声明一个字符数组时

char myarr[5] = "abcd";

这是 你的 数组。 abcd 字母被复制到您的本地数组中,您可以随意使用它。 c++ 中的字符串文字(“”中的字符串)的类型为 const char[N] 。你可以存储一个指向它的指针

const char* p = "abcd"

现在,因为 p 是 const,你不能修改你的字符串文字,这很好。不幸的是,由于历史原因,存在从字符串文字到char*的隐式转换

char * p = "abcd"

在这种情况下,很遗憾您可以修改字符串文字,但这样做会导致未定义的行为。幸运的是,这种转换已被弃用。

请注意,这是字符串文字的一个独特问题,因为它是唯一的左值文字类型。所有其他文字都是右值,因此没有修改它们的概念。

【讨论】:

  • 我要补充一点,您可以存储指向字符串文字的指针的原因是因为字符串文字(与任何其他数组一样)可以进行数组到指针的转换,从而为您提供指向它的指针第一个元素。
  • C++11 中最终不是去掉了这种转换吗?
  • @PlasmaHH,似乎并非如此:-std=c++11 模式下的 GCC 4.7 并不认为这是一个错误,而只是发出警告 deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  • @PlasmaHH:我很高兴知道它有……但我不确定
  • @ArmenTsirunyan: C.1.1 声明它已被更改,例如:"char* p = "abc"; // 在 C 中有效,在 C++ 中无效"
【解决方案2】:

char* 为Read Only Memory 中的字符串保留空间,因此您无法更改它。而char str[] 在堆栈上。 char* 类型的变量的行为类似于 const,因此您无法更改它。

【讨论】:

    【解决方案3】:

    在前一种情况下,您将数组声明为,

        char str[SIZE]; 
    

    分配的内存属于你的程序,可以修改。

    在后一种情况下,

       char* str="abcd" ; // str is a pointer to string literal, essential makes it a const char * 
    

    您正在尝试写入只读内存位置,但行为未定义。

    【讨论】:

      【解决方案4】:

      如果您创建一个array of char = char[],这将在堆栈上保留包含您放入其中的符号的空间 + \0。因为它在堆栈上,所以可以写入。
      但是像char *pc = "abcd" 这样的东西会在程序的只读部分中创建一个字符串“abcd”。你只有一个指向只读字符串或者const char*的指针。

      【讨论】:

        猜你喜欢
        • 2014-11-07
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 2011-10-11
        • 2019-04-09
        • 2013-11-18
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多