我读了:
在C中,局部变量以未知值开头
我决定检查它,这就是我所做的:
同一程序的三个结果:1,2,3。
问题1:为什么在1中未知值,或者为什么全局int
为0,local int
是1?
问题2:为什么每个新开始的本地unsigned int
都不同?
问题3:是全局/本地char
''?char ch = ' '; // something like that
问题4:为什么全局和本地以不同的值开始(如果不是初始化的)?为什么?
源代码:(我使用clang(v10.0.0)进行编译)
#include <stdio.h>
int global_int;
unsigned int global_unsint;
char global_char;
int main()
{
int local_int;
unsigned int local_unsint;
char local_char;
printf ("Global int: %d t unsigned_int: %u t char: %cn", global_int, global_unsint, global_char);
printf ("Local int: %d t unsigned_int: %u t char: %cn", local_int, local_unsint, local_char);
}
本地变量以未知值开头
不是完全正确的。具有自动存储持续时间的本地变量 do;static
变量以零初始化。碰巧的是,代码段中main()
中的所有本地变量都有自动存储持续时间。
为什么未知值是1,为什么全局int为0,local int是1?
全局变量具有静态存储持续时间。这意味着它们在程序启动时被隐式初始化。具有自动存储持续时间的本地变量具有未定义的值,直到明确初始化为止。
为什么每个新起点的本地unsigned_int都不同?
这是您的不确定行为。所有赌注都关闭了。
Global/Local Char是'?
否。全局char
被隐式初始化为程序启动时的' '
。本地char
具有不确定的值。
为什么全局和本地的元素从不同的值开始(如果不是初始化的)?为什么?
由于有规则的初始化具有静态存储持续时间和自动存储持续时间的对象。
访问非初始化(或以前未分配的)变量调用不确定的行为。
任何事情都可能发生;例如
- 您的编译器可能会产生可执行文件
- 您的可执行文件可能"运行"
- 运行可执行文件似乎可以按预期工作
- 可以将打印的值推理为
或以上都不是,具体取决于月球阶段,编译器标志,其他程序同时在计算机上运行的其他程序,...,...,...
要更好地了解正在发生的事情,您应该知道大多数架构都使用本地自动变量分配的堆栈。使用每个函数("调用"),使用堆栈的一些存储,并且在每个函数返回时,存储再次可用。
这意味着函数的自动变量使用之前使用过的堆栈空间(通过另一个函数),并且由于这些变量未由编译器或运行时系统初始化,因此它们包含来自早期函数调用的值。因此,对于您的功能,它们的值是。
global_int
, global_unsint
, global_char
是全局变量。它们将位于BSS段。OS内核将它们仅将它们映射到具有零值的页面上的复制,以保存在OS侧的分页处理。这就是为什么您总是看到它们的值为零。
local_int
, unsigned int local_unsint
,`local_charq是自动变量。它们将位于主要功能的堆栈段。它们的价值不确定。它们取决于在运行时分配的堆栈上的内存位置。因此,我们无法信任自动变量的初始化值。