像这样在C中声明数组时:int array[10];整数的初始值是多少?我在使用不同的编译器时会得到不同的结果,我想知道它是否与编译器或OS有关。
3 回答
紫衣仙女
TA贡献1839条经验 获得超15个赞
按照标准设置,所有全局和函数静态变量都会自动初始化为0。自动变量不会初始化。
int a[10]; // global - all elements are initialised to 0
void foo(void) {
int b[10]; // automatic storage - contain junk
static int c[10]; // static - initialised to 0
}
但是,最好始终手动初始化函数变量,而不管其存储类如何。要将所有数组元素设置为0,您只需要将第一个数组项分配为0-省略的元素将自动设置为0:
int b[10] = {0};
陪伴而非守候
为什么
TA贡献1757条经验 获得超8个赞
为什么auto
在其他所有内容都未初始化时,函数局部变量(存储类)未初始化?
C与硬件接近;这是它最大的优势,也是最大的危险。究其原因auto
存储类对象具有随机初始值,是因为他们在栈上分配,和设计决定不自动清除这些(部分原因是因为他们需要对每个函数调用将被清除)。
另一方面,非auto
对象仅需清除一次。另外,出于安全原因,操作系统必须清除分配的页面。因此,这里的设计决定是指定零初始化。为什么安全性也不是堆栈的问题?实际上,一开始它已清除。您看到的垃圾来自您自己程序的调用框架的早期实例以及它们所调用的库代码。
最终结果是快速的内存有效代码。装配的所有优势无所不包。在dmr发明C之前,“ Basic”和整个OS内核之类的“ HLL”实际上确实是作为大型汇编程序实现的。(在某些地方,例如IBM除外)。
- 3 回答
- 0 关注
- 552 浏览
添加回答
举报
0/150
提交
取消