C ++ cout新阵列乱码

时间:2010-10-07 01:36:13

标签: c++

当我“cout”一个空阵列时,我得到了胡言乱语。为什么呢?

int main() { char test[10]; cout << test; return 0; }

...返回一些unicode blather。一个简单的答案我敢肯定。

5 个答案:

答案 0 :(得分:8)

因为您的数组未初始化。它的内容可以是任何内容,并且使用它们会得到未定义的行为。

您可以将它们全部初始化为零:

char test[10] = {};

打印时,不会打印任何内容。

答案 1 :(得分:4)

由于你没有初始化数组,你得到了一个垃圾值(test [0]就是你打印出来的)。

初始化:

int main() { 
    char test[10] = {};
    cout << test;
    return 0;
}

请注意:

仅仅因为一些编译器初始化东西(比如某些编译器初始化整数,浮点数等,在0),情况并非总是如此,否则你可以得到一个垃圾值。

答案 2 :(得分:4)

C ++中没有“空数组”这样的东西。你定义了一个10 char s的数组 - 你有一个10 char的数组。因为它是一个本地数组,所以默认情况下它是未初始化的,这意味着10 char中的每一个都包含垃圾。垃圾就是你打印的。

答案 3 :(得分:1)

您的数组未初始化为任何内容,并且您正在输出该未初始化数组的第一个元素。

如果你想要可预测的行为,你需要先初始化数组(以下初始化为一个空数组):

int main() { char test[10] = {}; cout << test; return 0; }

答案 4 :(得分:0)

没有初始化的数组将填充之前占用内存的任何内容,这就是您在输出中设置的内容。值得注意的是,您可能会看到调试和发布编译之间的差异。许多编译器会在调试模式下自动初始化变量,并将其作为编译器设置。你不应该依赖于此。有几种方法可以初始化字符数组。

简单

char test[10] = {};

有一些文字

char test[] = "some text";

作为个别角色

char test[] = { 's', 'o', 'm', 'e' };

第一个值集(对于字符串,这是一个空字符串'\ 0'被视为终结符

char test[] = { 0 };

或者像这样。

char test[];
test[0] = '\0';

还记得数组和指针等价

哪里

char* test = "some text";

与...相同

char test[] = "some text";