C 当我使用初始化作为int数组[10]={0}时,数组存储在哪里;

C 当我使用初始化作为int数组[10]={0}时,数组存储在哪里;,c,arrays,C,Arrays,默认情况下,本地数组存储在堆栈中。未初始化的本地数组将被分配垃圾值。 但是为什么这个语法int数组[10]={0}默认情况下将所有数组元素初始化为零?即使我给出int数组[10]={10,20}//它将所有其余元素初始化为零。 在这种情况下,它不是存储在堆栈上吗?如何将它们全部初始化为零?本地数组是否初始化与它是否存储在堆栈上无关 如果实现使用堆栈,那么数组将位于堆栈上,无论是否初始化 根据本手册第6.7.9节: 10如果没有显式初始化具有自动存储持续时间的对象,则其值不确定。如果 具有静态或线

默认情况下,本地数组存储在堆栈中。未初始化的本地数组将被分配垃圾值。 但是为什么这个语法
int数组[10]={0}默认情况下将所有数组元素初始化为零?即使我给出
int数组[10]={10,20}//它将所有其余元素初始化为零。


在这种情况下,它不是存储在堆栈上吗?如何将它们全部初始化为零?

本地数组是否初始化与它是否存储在堆栈上无关

如果实现使用堆栈,那么数组将位于堆栈上,无论是否初始化

根据本手册第6.7.9节:

10如果没有显式初始化具有自动存储持续时间的对象,则其值不确定。如果 具有静态或线程存储持续时间的对象不可用 显式初始化,然后:

-如果它具有指针类型,则为 初始化为空指针

-如果它有算术类型,则为 初始化为(正或无符号)零

-如果它是一个集合, 根据这些规则(递归地)初始化每个成员, 并且任何填充被初始化为零位

-如果它是一个联盟,那么 第一个命名的成员根据这些参数进行初始化(递归) 规则,并且任何填充都初始化为零位

21如果括号内的列表中的初始值设定项少于 是集合的元素或成员,或集合中的字符数较少 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的剩余部分 应隐式初始化为与具有静态 存储持续时间


因此,如果初始值设定项列表的元素少于数组,则其余元素的初始化方式与非局部变量相同,即设置为0。

与初始化任何内容的方式相同。这里有什么问题?您不能修改堆栈上分配的内存吗?(是的,您可以)“默认情况下,本地数组存储在堆栈中”-并非所有具有本地(即块)范围的变量都存储在堆栈上。并不是所有的实现都使用堆栈。标准不需要一堆东西,我看不出一个通情达理的人为什么会在这里投票。这是一个关于C@Olaf中常见错误理解的诚实问题:OP确实说了“默认”。在缺少
静态
关键字的情况下,本地数组存储在“堆栈”上。您认为并非所有实现都使用堆栈的观点是有效的。具有自动存储持续时间的对象必须以类似后进先出的方式在堆栈中创建和销毁,但它们不需要存储在分配给连续内存的“堆栈”中(尽管这是目前最常见的实现)。因此,数组仍然存储在堆栈中,但编译器正在采取额外步骤将其初始化为零(按标准规定)@Raj Correct。初始化并不影响内存的布局,只影响内容是否已知。标准要求将对象的剩余部分初始化为零;它没有说明如何实现。编译器将生成满足标准中给出的要求所需的任何代码。有几乎可以肯定,您没有理由关心它是如何完成的,但是您可以随时检查生成的代码。(@dbush:我想您知道这一点;此注释主要针对OP。)