C++ 如果我们不初始化,为什么分配的存储空间和“正常”创建的阵列的行为会有所不同?

C++ 如果我们不初始化,为什么分配的存储空间和“正常”创建的阵列的行为会有所不同?,c++,C++,我创建了一个存储空间分配如下的阵列: int*geom=新int[50] 我打印了从-1000到1000的geom值,我希望得到随机值,因为我没有初始化数组的任何值。然而,在每次编译和执行之后,我在某些地方得到了很多零和随机数,它们的值和位置保持完全相同 ` ... value of geom[-2] :209 ... value of geom[43] :0 value of geom[44] :0 value of geom[45] :0 value of geom[46] :0 value

我创建了一个存储空间分配如下的阵列:

int*geom=新int[50]

我打印了从-1000到1000的geom值,我希望得到随机值,因为我没有初始化数组的任何值。然而,在每次编译和执行之后,我在某些地方得到了很多零和随机数,它们的值和位置保持完全相同

`
...
value of geom[-2] :209
...
value of geom[43] :0
value of geom[44] :0
value of geom[45] :0
value of geom[46] :0
value of geom[47] :0
value of geom[48] :0
value of geom[49] :0
value of geom[50] :1041
value of geom[51] :0
value of geom[52] :1970037110
value of geom[53] :1718558821
value of geom[54] :1868916512
value of geom[55] :892689261
value of geom[56] :943333469
value of geom[57] :858993460
value of geom[58] :808858675
value of geom[59] :2570
value of geom[60] :0
value of geom[61] :0
...
value of geom[310] :60609
`
正如你所看到的,特别是对于负的一面,对于[-2],我只得到了0和209。这意味着它不是一种随机类型的东西

我想知道,如果我们不使用std::fill\n来填充数组的值,是否存在默认的构造函数类型?如果它存在,它如何知道它应该填充到数组的哪个点,因为我在2000个单元格的范围内没有得到随机分布的值

当我声明一个数组(如:int geom[50])时,每次执行和编译都会得到随机值,但仍然有大量的零

顺便说一下,我正在使用Ubuntu 18.04。

geom[-2]在这里不是有效的数组索引。尝试读取或写入它会调用未定义的行为,读取有效但未初始化的索引也是如此

这意味着你的整个程序现在毫无意义,编译器也没有义务生成任何特定的行为——从字面上说,任何事情都会发生;从崩溃,到删除所有代码,到做你想做的事情,再到向硬盘写入垃圾。一旦您的代码包含UB并且您没有任何保证,所有这些都是可接受的结果

当您参与UB时,编译器也没有义务警告您,它可以假设您没有违反规则,并基于这样的假设生成代码:当然,您没有违反规则,如果您确实违反了规则,那么您可以保留任何被打破的混乱结果

从UB代码中观察到的任何行为都可能在下次运行应用程序时、更改或升级编译器时、更改操作系统时以及出于许多其他原因而发生更改。 您已经离开了定义良好的程序行为领域,对程序的结果没有任何期望

另见:


这也是相关的:

我希望得到随机值,这是未定义的行为。任何事情都有可能发生。这并不意味着它每次的表现都会不同,也不能保证任何形式的随机性。除了未定义的行为之外,你对未定义行为的任何期望都是错误的。听起来你在问是否有某种方法可以取消变量的初始化。这就是您要求的吗?geom[-2]不是有效的数组索引。尝试读取或写入它会调用未定义的行为,读取有效但未初始化的索引也会调用未定义的行为。这意味着您的整个程序现在毫无意义,编译器没有义务生成任何特定的行为——从字面上说,任何行为都会发生;从崩溃,到删除所有代码,到做你想做的事情,再到向硬盘写入垃圾。一旦您的代码包含UB并且您没有任何保证,所有这些都是可接受的结果。当你参与UB时,编译器也没有义务警告你,它可以假设你没有。是的,这就是我所说的未定义行为并不保证任何随机性。它不是随机的,它是未定义的。观察到的行为可能因任何原因在任何时候发生变化,也可能不会发生变化。没有理由期望有很多零,也没有理由期望零很少。做疯狂的实验,这是一个很好的学习方法。如果不是,你会一直假设它是随机的。这不是真的。一般来说,负数组索引本身并不是无效的。@SergeyA你能详细说明什么是不正确的吗?我想说的是1-2在这里不是一个有效的索引,读或写它都是UB。2如果索引处的值尚未初始化,则读取任何其他有效索引也是无效的。我没有说清楚,还是你不同意?如果是,为什么/如何?在语言中,负索引是有效的-这是一个C问题,但适用。但是,在当前问题中,它不是有效的geom[-2]。除非在某些隐藏代码中,OP更改了geom指向的内容,即geom+=2;。在编辑之前,我阅读你答案的方式是,任何负面索引都是无效的。在以后的编辑中,不再支持这种阅读。@SergeyA我很高兴我的编辑使它更清晰了。谢谢你指出答案还有待改进。