C中的本地int与Global int

时间:2019-02-21 15:15:01

标签: c global-variables local-variables

我读到了:

  

在C中,局部变量以未知值开头

我决定检查一下,这就是我所做的:

同一程序的三个结果:123

问题1:为什么1中的值未知,或者为什么全局int为0而局部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: %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); 
}

4 个答案:

答案 0 :(得分:7)

  

局部变量以未知值开头

并非完全正确。具有自动存储持续时间的局部变量可以执行; static变量初始化为零。碰巧,您的代码段中main()中的所有局部变量都有自动存储时间。

  

为什么未知值是1,或者为什么全局int为0而局部int为1?

全局变量具有静态存储持续时间。这意味着它们将在程序启动时隐式初始化为零。具有自动存储期限的局部变量在未明确初始化之前具有未定义的值。

  

为什么每个新起点的本地unsigned_int不同?

对您来说,这是未定义的行为。所有的赌注都没有。

  

全局/本地字符是''吗?

不。全局char在程序启动时隐式初始化为'\0';本地char的值不确定。

  

为什么全局和局部以不同的值开头(如果未初始化)?为了什么?

由于存在用于初始化具有静态存储持续时间和自动存储持续时间的对象的规则。

答案 1 :(得分:4)

访问未初始化(或之前未分配)的变量将调用Undefined Behavior

任何事情都会发生;例如

  • 您的编译器可能会生成可执行文件
  • 您的可执行文件可能会“运行”
  • 运行可执行文件似乎可以正常工作
  • 打印出的值可能会被解释为

或以上都不是,具体取决于月相,编译器标志,计算机上同时运行的其他程序是...,...,...

答案 2 :(得分:1)

为了更好地了解正在发生的事情,您应该知道大多数体系结构都使用堆栈,在堆栈上分配了本地自动变量。在调用每个函数(“调用”)时,都会使用堆栈的一些存储空间,并且在每个函数返回时,该存储空间将再次可用。

这意味着一个函数的自动变量使用的栈空间之前已被(另一个函数)使用,并且由于这些变量未由编译器或运行时系统初始化,因此它们包含早期函数调用中的值。因此对于您的函数,它们的值是 undefined

答案 3 :(得分:0)

global_intglobal_unsintglobal_char是全局变量。它们将位于bss段中。 OS内核将简单地将它们映射到具有零值页面的写时复制,以将分页处理保存在OS端。这就是为什么您总是看到它们的值为零的原因。

local_intunsigned int local_unsint,`local_charq是自动变量。它们将位于主函数的堆栈段中。它们的值尚不清楚。它们取决于在运行时分配给它们的堆栈上的内存位置。因此我们不能相信自动变量的初始化值。