我读到了:
在C中,局部变量以未知值开始
我决定检查一下,这就是我所做的:
同一计划的三个结果:qazxsw poi,qazxsw poi,qazxsw poi。
问题1:为什么1中的未知值,或者为什么全球1为0且本地2为1?
问题2:为什么每个新开始的本地3不同?
问题3:全球/本地int
''? int
问题4:为什么全局和本地以不同的值开始(如果它们没有初始化)?为了什么?
源代码:(我用过clang(v10.0.0)进行编译)
unsigned int
局部变量以未知值开头
不完全正确。具有自动存储持续时间的局部变量; char
变量初始化为零。碰巧的是,代码片段中char ch = ' '; // something like that
中的所有局部变量都有自动存储持续时间。
为什么未知值为1,或者为什么global int为0且local int为1?
全局变量具有静态存储持续时间这意味着它们在程序启动时被隐式初始化为零。具有自动存储持续时间的局部变量在显式初始化之前具有未定义的值。
为什么每个新开始的本地unsigned_int不同?
那是你未定义的行为。所有赌注都已关闭。
全球/本地的焦点是''?
没有。全球#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: %c\n", global_int, global_unsint, global_char);
printf ("Local int: %d \t unsigned_int: %u \t char: %c\n", local_int, local_unsint, local_char);
}
在程序启动时被隐式初始化为static
;当地的main()
有一个未定义的值。
为什么全局和本地以不同的值开始(如果它们没有初始化)?为了什么?
由于具有静态存储持续时间和自动存储持续时间的对象的初始化规则。
访问未初始化(或以前未分配)的变量会调用char
。
任何事情都可能发生;例如
或者以上都不是,取决于月亮的阶段,编译器标记,同时在您的计算机上运行的其他程序,...,...,...
为了更好地理解发生了什么,您应该知道大多数体系结构使用堆栈,在该堆栈上分配本地自动变量。对于每个被调用(“调用”)的函数,使用堆栈的一些存储,并且在每个函数返回时,该存储再次可用。
这意味着函数的自动变量使用之前(由另一个函数)使用的堆栈空间,并且因为这些变量未由编译器或运行时系统初始化,所以它们包含来自早期函数调用的值。因此,对于您的函数,它们的值是未定义的。
'\0'
,char
,Undefined Behavior是全球变量。它们将位于bss段。操作系统内核将简单地将它们映射到具有零值页面的写入时复制,以便在OS端保存分页处理。这就是为什么你总是看到它们的值为零的原因。
global_int
,global_unsint
,`local_charq是自动变量。它们将位于主函数的堆栈段上。他们的价值并不确切。它们取决于在运行时分配的堆栈上的内存位置。所以我们不能相信自动变量的初始化值。