c ++ empty char数组的长度为> 0

时间:2018-05-18 00:33:52

标签: c++ arrays char

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

#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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

标准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中使用它们时,您应该能够回答问题&#34;为什么?&#34;有原因....但你应该有一个。

答案 2 :(得分:1)

问题:

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

根据dcl.init/12

  

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

因此,test1具有不确定值

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

答案 3 :(得分:-1)

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

char test2[128]={0}; 

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