有一个基本的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
答案 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
使用自动或动态存储来存储对象时 获得持续时间,该对象具有不确定值,和 如果没有为对象执行初始化,则该对象保留 一个不确定的值,直到该值被替换。
因此,test1
具有不确定值。
在函数中使用此变量是未定义的行为。
答案 3 :(得分:-1)
初始化代码'test2 [127] = 0;'是不正确的。您应该按如下方式初始化char数组:
char test2[128]={0};
或
char test2[128];
test2[0] = 0;