【问题标题】:Does the null character get automatically inserted?空字符会自动插入吗?
【发布时间】:2014-01-05 20:15:03
【问题描述】:

C++ 编译器是否应该在 char 数组末尾自动插入空字符?下面打印“Word”。那么C++编译器会在数组最后一个位置自动插入一个空字符吗?

int main()
{
    char x[] = {'W', 'o', 'r', 'd'};
    cout << x << endl;
    return 0;
}

【问题讨论】:

  • 以防万一有人不熟悉 c++ 并阅读此内容,使用 std::string 将使您免于遇到许多此类未定义行为的麻烦。

标签: c++ arrays string initialization string-literals


【解决方案1】:

不,它没有。您的数组 x 只有 4 个元素。您正在向std::cout 传递一个指向char 的指针,它不是以空字符结尾的字符串的开头。这是未定义的行为。

例如,在我的平台上,类似的代码打印Word?,带有一个虚假的问号。

【讨论】:

  • 我也运行了代码,但现在我被慢性鼻恶魔困住了。谢谢。 :(
【解决方案2】:

在 C/C++ 中,字符串文字自动附加以终止零。所以如果你会写例如

char x[] = "Word";

那么数组的大小将等于 5,并且数组的最后一个元素将包含 '\0'。

如您所见,使用以下记录时

char x[] = {'W', 'o', 'r', 'd'};

那么编译器分配的元素数量与初始化器的数量完全相同。也就是说,在这种情况下,数组将只有 4 个元素。

但是,如果你要这样写

char x[5] = {'W', 'o', 'r', 'd'};

那么第五个元素将包含终止零,因为它没有相应的初始化器,并且将被零初始化。

还要考虑到以下记录在C中有效但在C++中无效

char x[4] = "Word";

【讨论】:

    【解决方案3】:

    这是未定义的行为,它会打印“Word”,因为它也可能已经崩溃。

    【讨论】:

      【解决方案4】:

      不,它没有。如果您想将其用作字符串,或者您想为此使用字符串的库函数,您自己必须这样做。

      【讨论】:

        【解决方案5】:

        不,它没有。如果要自动插入,请使用字符串常量:

        const char *x = "Word";
        //OR 
        std::string const s = "Word";
        const char *x = s.c_str();
        //OR
        char x[] = { "Word" }; //using the C++11 brace initializer syntax.
        

        验证这一点的最简单方法是使用调试器查看 x 的内存地址并监视它以及它后面的几个字节。初始化后停止调试器并检查内存内容。

        【讨论】:

          【解决方案6】:

          不,在这种情况下,您只是创建了一个非空终止数组。在基于空终止的读取的情况下。您的程序不会停止,因为它最终找不到 null。

          char x[] = "Word";
          

          在这种情况下,将为 x 分配 5 个字节。最后为空。

          【讨论】:

            【解决方案7】:

            不,如果您想将char 数组用作字符串,请使用这种形式的初始化程序

            char x[] = { "Word" };
            

            【讨论】:

              猜你喜欢
              • 2021-01-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-28
              • 1970-01-01
              相关资源
              最近更新 更多