回复【2楼】龙之谷: --------------------------------- ZI的意思是Zero Initialized,从字面的理解应该是用0进行初始化。我之前知道static类型的值不初始化的话会自动初始化为0,而局部变量的值不初始化则是未定义的。 不过刚刚搜了一些文档,在ARM官方的文档中心有这样一段说明"The ANSI C specification states that static data that is not initialized explicitly should be initialized to zero. The compiler therefore places both zero-initialized and uninitialized data in the same ZI section, which is zero-filled at run time by the C library initialization code."大意是ANSI C规范规定没有进行初始化的static型变量应该被初始化为0。编译器本身把需要初始化为0的变量(static型变量)和不需要初始化的变量统一放在了ZI区,并在C语言库的初始化代码中对ZI区的所有内容进行了初始化为0的操作。 文档地址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/4027.html 最后我用一个简单的串口打印程序进行了验证: static int s_value; int g_value; int main(void) { int l_value; printf("The static value is %d
", s_value); printf("The global value is %d
", g_value); printf("The local value is %d
", l_value); } 最终输出的值都为0,所以ZI区域的内容应该是全部被初始化为0的(堆栈也在ZI区),定义在堆栈中的局部变量会随着堆栈的使用而呈现不同的值(但一开始也是0),因此局部变量不初始化使用是危险的。
---------------------------------
ZI的意思是Zero Initialized,从字面的理解应该是用0进行初始化。我之前知道static类型的值不初始化的话会自动初始化为0,而局部变量的值不初始化则是未定义的。
不过刚刚搜了一些文档,在ARM官方的文档中心有这样一段说明"The ANSI C specification states that static data that is not initialized explicitly should be initialized to zero. The compiler therefore places both zero-initialized and uninitialized data in the same ZI section, which is zero-filled at run time by the C library initialization code."大意是ANSI C规范规定没有进行初始化的static型变量应该被初始化为0。编译器本身把需要初始化为0的变量(static型变量)和不需要初始化的变量统一放在了ZI区,并在C语言库的初始化代码中对ZI区的所有内容进行了初始化为0的操作。
文档地址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/4027.html
最后我用一个简单的串口打印程序进行了验证:
static int s_value;
int g_value;
int main(void)
{
int l_value;
printf("The static value is %d ", s_value);
printf("The global value is %d ", g_value);
printf("The local value is %d ", l_value);
}
最终输出的值都为0,所以ZI区域的内容应该是全部被初始化为0的(堆栈也在ZI区),定义在堆栈中的局部变量会随着堆栈的使用而呈现不同的值(但一开始也是0),因此局部变量不初始化使用是危险的。
一周热门 更多>