C 中的本地 int 与 Global int

Local int vs Global int in C

我读到:

in C, local variables start with unknown value

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

同一个程序的三个结果:1, 2, 3.

问题 1: 为什么 1 中的值未知,或者为什么全局 int 为 0 而局部 int 为 1?

问题 2: 为什么本地 unsigned int 与每个新开始都不一样?

问题三:是global/localchar''吗? char ch = ' '; // something like that

问题4:为什么global和local以不同的值开始(如果它们没有被初始化)?为了什么?

源代码:(我使用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); 
}

local variables start with unknown value

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

Why unknown value it's 1, or why global int was 0 and local int was 1?

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

Why local unsigned_int with each new start was different?

这对你来说是未定义的行为。所有投注均已取消。

Is global/local char was ' ' ?

没有。全局 char 在程序启动时隐式初始化为 '[=13=]';本地 char 具有未定义的值。

Why global and local start with different values (if they are not initialised)? For what?

由于静态存储时长和自动存储时长对象的初始化规则。

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

任何事情都可能发生;例如

  • 您的编译器可能会生成可执行文件
  • 您的可执行文件可能 "run"
  • 运行 您的可执行文件可能会按预期工作
  • 打印的值可能是
  • 的原因
以上的

或 none,取决于月相、编译器标志、您的计算机上同时有哪些其他程序 运行,..., .. ., ...

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

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

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

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