【问题标题】:c++ empty char array has length > 0c ++空字符数组的长度> 0
【发布时间】:2018-05-18 00:33:52
【问题描述】:

有一个基本的 C++ 问题。我发现未初始化的 char 数组的长度 > 0。有人可以解释一下吗?

#include <iostream>
int main() {
    char test1[5];
    test1[4] = 0;
    printf("test1 array %s, length %d\n", test1, strlen(test1));

    char test2[128];
    test2[127] = 0;
    printf("test2 array %s, length %d\n", test2, strlen(test2));
}

这会打印(为什么第一个数组为空且长度为零,而第二个数组为非空且非零长度)?:

test1 array , length 0
test2 array 8??, length 6

【问题讨论】:

  • 由于您使用的是 C++,因此了解 std::vectorstd::string 之类的内容非常重要。 strlen 是 C 代码,不属于这里,除非您的目标是编写 C 代码。
  • 如果你不初始化你的变量,它们可能会充满任何东西,包括连续 6 个非 0 字节。
  • 现在数组在编译时是固定大小的容器。因此,当您创建数组时,无论您是否初始化它,它都会分配内存。
  • 我发现未初始化的 char 数组的长度 > 0。 -- 我真的不明白你为什么感到惊讶。如果它没有初始化,你期望什么?
  • @PaulMcKenzie 看到这个也是我的问题。 null 终止数组展示了一些关于事情如何工作的知识。如果假设未初始化的数组都为零,那么就没有理由显式地为 null 终止它们。

标签: c++ arrays char


【解决方案1】:

由于您尚未初始化这些值,您将获得未定义的行为。也就是说,它们可以包含任何东西。可能是零,也可能是随机数据。

将未初始化的字符缓冲区传递给printf 是未定义的行为,不应这样做。这可能行得通,也可能行不通。获得定义行为的唯一方法是正确初始化它。

【讨论】:

  • 看起来您对 C++ 很感兴趣,但对标准没有太多了解。 UB != 未初始化或不确定的值。
  • @iBug 对不确定值的操作可能会导致 UB(在这种情况下确实如此)
【解决方案2】:

标准C 字符串以空终止符结尾,您的未初始化数据中可能有也可能没有。我认为其他答案已经涵盖了这一点。

虽然这可能看起来很迂腐,而且您可能已经知道,但 char 数组的长度与其包含的字符串的长度不同(如果它包含一个)。 sizeof() 在变量上的输出不是未定义的,因为它根本不查看内容:

#include <string.h>
#include <iostream>
int main() {
    char test1[5];
    test1[4] = 0;
    printf("test1 array %s, string length %d array length %d\n", test1, strlen(test1), sizeof(test1)/sizeof(char));

    char test2[128];
    test2[127] = 0;
    printf("test2 array %s, string length %d array length %d\n", test2, strlen(test2), sizeof(test2)/sizeof(char));
}

输出:

test1 array , string length 0 array length 5
test2 array P`, string length 3 array length 128

最后一点。以 NULL 结尾的字符串是有问题的。每当您发现自己在 C++ 而不是 std::string 中使用它们时,您应该能够回答“为什么?”这个问题。有原因......但你应该有一个。

【讨论】:

    【解决方案3】:

    问题:

    char test1[5]; // no initialization
    test1[4] = 0;  // this is assignment not initialization
    

    根据dcl.init/12

    当对象存储时自动或动态存储 获得持续时间,对象具有不确定值,并且 如果没有对对象执行初始化,则该对象保留 一个不确定的值,直到该值被替换。

    因此,test1 具有不确定值

    在函数中使用这个变量是未定义的行为

    【讨论】:

      【解决方案4】:

      初始化代码'test2[127] = 0;'是不正确的。您应该按如下方式初始化 char 数组:

      char test2[128]={0}; 
      

      或者

      char test2[128];
      test2[0] = 0;
      

      【讨论】:

      • 用户所做的没有任何问题,它是完全有效的代码。就目前而言,我认为这不能回答问题,但也许如果您添加更多解释,它可能会。
      • 这个答案提示了解决方案,而没有说出出了什么问题以及为什么初始化更改可以解决问题。不值得投反对票,但也不值得投赞成票。
      • @RetiredNinja 原码无效;它将不确定的值传递给 C 库函数
      • @RetiredNinja 这显然不是完全有效的代码。虽然在语法上是正确的,但在逻辑上是不正确的。要将char数组初始化为空字符串,代码test2[127] = 0;不正确,应该是test2[0] = 0;char test2[128]={0}
      • 显示的代码在语法上是正确的。说这是不正确的假设 OP 正在寻求做问题中未提及的事情。这将是“如何将数组初始化为全零?”的一个很好的答案,但这不是要问的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多