C++ 数组未在C+中初始化时出现奇怪的数字+;

C++ 数组未在C+中初始化时出现奇怪的数字+;,c++,arrays,C++,Arrays,编辑:^^^“复制”根本没有提到数组 Edt2:在C中,不是C++,2种语言之间没有区别吗?!p> 这个问题最近困扰了我一段时间。谷歌搜索没有透露任何信息 p>所以我有这个例子C++代码: int factors[100]; /* note this is not initialized */ int number = /* less than 100 */ 10; for (int i = 0; i < number; i ++) { factors[i] = 1; } for

编辑:^^^“复制”根本没有提到数组
Edt2:在C中,不是C++,2种语言之间没有区别吗?!p> 这个问题最近困扰了我一段时间。谷歌搜索没有透露任何信息

<> p>所以我有这个例子C++代码:

int factors[100]; /* note this is not initialized */
int number = /* less than 100 */ 10;
for (int i = 0; i < number; i ++) {
    factors[i] = 1;
}
for (int i = 0; i < 100; i ++) {
    std::cout << factors[i] << std::endl;
}

为什么不是十个1或者十个1加九十,为什么有这么多看似随机的数字(可能与2的幂有关?)?我想这可能与内存分配或一些事情有关,但我只是初学者,我还没有进入这类东西。

就是这样,如果你不初始化数组,如果你有声明< /p>,C++不能保证它是空白的

int factors[100]; /* note this is not initialized */
有两种情况:

  • 当声明为全局(文件范围)变量时,整个数组将在程序启动前初始化为零

  • 当声明为局部(函数范围)变量时,数组不会初始化,并且将包含不可预测的数字


  • 未初始化的数组中填充了垃圾值。垃圾值是指在用户请求之前存在于该特定内存位置中的那些值。内存位置始终存在。在许多情况下,当编译器在返回这些位置之前显式写入default值时,输出为0。但这种行为并不总是存在的由C/C++编译器显示,因此会出现不同的输出。

    但为什么会这样?因为更改它们的值需要时间,如果您要以任何方式覆盖它们,则会浪费宝贵的时间。请务必注意,静态存储中的变量将初始化为零。因为操作系统为您的代码分配了内存。它不为其设置任何值。假设之前运行的软件使用了内存地址0xf000000中的值3,则该软件停止运行,您的软件将获得相同的地址。那里的值仍然是3Just
    int factors[100]={0}
    ;别让它打扰你。别担心,使用
    std::vector
    ,开心点@保罗麦肯齐:即使这样也不能保证。虽然C++标准没有使用这个术语,但是C标准讨论了一些可以做奇怪事情的值(比如引起一个信号或者关闭程序),只是试图读取一个未初始化的值。你观察到的行为与数组无关,这在DUP中有解释。@BaummitAugen,我想是时候放弃了。那些不会被教导的人不能被教导……好吧,如果我想防止这种情况发生,我可以把我所有的数组移到
    int main(){}
    ?是的,这会使它们成为全局变量,因此初始化为零。@Raumankidwi请不要这样做。如果你需要的话,你应该显式地将它们初始化为零。C++委员会决定,他们不需要编译器在不需要的时候制作需要时间的东西。因此,如果没有指定初始化,它不需要生成代码来初始化数组,因为它可能会增加二进制大小并稍微影响执行速度。这与为什么new int()返回垃圾,以及为什么当执行超出函数的作用域
    int factors[100]={}时堆栈空间未被清理的原因相同默认值将所有内容初始化为
    0
    。第一个
    0
    只决定第一个数字是什么。你可以做
    int-factors[100]={5}这将使
    因子[0]==5
    和所有其他
    0
    int factors[100]; /* note this is not initialized */