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 */