c中局部变量的默认值是垃圾值,对吗?那为什么总是得到相同的输出? [复制]

问题描述 投票:-1回答:3
void func();

int main() {
  func();
  func();
  func();
}

void func() {
  int a;
  printf("%d\n",++a);
}

当我在GCC编译器中运行此C代码时,输​​出为

1 
2
3

为什么不使用static关键字就发生这种情况?

c ubuntu gcc
3个回答
5
投票

有两种情况要考虑:

  • 如果局部变量为static,则将其初始化为零;指针类型的static变量设置为NULL
  • 如果局部变量是自动的,则根本不会初始化。从此类变量读取而不先分配变量是未定义的行为。

3
投票

根据C标准(6.7.9初始化)

10如果具有自动存储持续时间的对象未初始化明确地,其值为indeterminate

和(3.19.2)

1不确定值,不确定值或陷阱表示

因此,具有自动存储持续时间的对象没有默认值。它们具有不确定的值。

请注意,局部变量和具有自动存储持续时间的变量的概念是不同的。例如在此程序中

#include <stdio.h>

int x = 10;

void f()
{
    extern int x;
    printf( "%d\n", x );
}

int main( void )
{
    f();
} 

在函数f中声明的变量x,如

    extern int x;

是函数的局部变量。但是它具有外部链接,并且表示与全局变量相同的变量。 X。

程序输出将是

10

0
投票

这是一个非常简单的程序。局部变量放在堆栈上。没有人可以保证程序开始时堆栈上会包含什么值。但是,由于您调用了递增局部变量a的相同函数,因此该变量在堆栈上递增。然后,再次调用相同的函数,以便它在堆栈上分配相同位置,该位置自上次以来已具有a的值。如果在func ()中的int main()之间调用任何其他函数(例如printf),则会得到不同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.