C中int数组的初始值
当在C中声明一个数组时,像这样:
int array[10];
整数的初始值是多少? 我用不同的编译器得到了不同的结果,我想知道它是否与编译器或操作系统有关。
如果数组在函数中声明,那么值是未定义的。 int x[10];
在一个函数中意味着:在不进行任何初始化的情况下获取memroy的10-int-size区域的所有权。 如果数组被声明为全局函数或在函数中声明为static
,则所有元素如果尚未初始化,则将其初始化为零。
由标准设置,所有全局和功能静态变量自动初始化为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};
为什么函数本地( auto
存储类)在其他所有内容都没有被初始化?
C接近硬件; 这是它最大的优势和最大的危险。 auto
存储类对象具有随机初始值的原因是因为它们分配在堆栈上,并且设计决定不会自动清除这些值(部分原因是它们需要在每次函数调用时清除)。
另一方面,非auto
对象只需要被清除一次。 另外,无论如何,出于安全原因,OS必须清除分配的页面。 所以这里的设计决定是指定零初始化。 为什么安全也不是安全问题? 事实上,它首先被清除。 你看到的垃圾是来自你自己程序的调用框架和他们调用的库代码的早期实例。
最终的结果是快速,高效的代码。 装配的所有优点都没有任何的痛苦。 在dmr发明C之前,“HLL”就像Basic和整个OS内核一样,实际上是作为巨型汇编程序实现的。 (在像IBM这样的地方有一些例外)。
链接地址: http://www.djcxy.com/p/78707.html