自动存储类

时间:2014-05-07 06:26:31

标签: c automatic-storage

  函数中使用的

自动 存储不会重新初始化使用 auto 关键字声明的 i 变量


  

Practice.c main()和func()位于 Practice.c

#include <stdio.h>

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


func()
{
  auto int i=1;
  printf("  i = %d",i);
  i=i+1;
}

执行 Practice.exe 编译后,输出如下:

i = 1
i = 1
i = 1

每当 main()调用 func()时,i会重新初始化为1.这是正确的,因为 i 的范围在 func()块,当控件来自块时, i 的值将丢失。因此,当我第二次调用 func()函数时, i 的值将重新初始化为 1 。< / p>

检查以下 New.c 计划。

  

New.c 包含 main()&amp; func()

#include <stdio.h>

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


func()
{
  auto int i;
  printf("  i = %d",i);
  i=i+1;
}
  

为了确保,我将函数 func()调用了8次。   但是在 New.c, i 未初始化。当我在编译后执行该程序时,它的输出如下:

i = 4201582
i = 4201583
i = 4201584
i = 4201585
i = 4201586
i = 4201587
i = 4201588
i = 4201589
  

输出显示每次通话的增量。这背后的确切原因是什么?

2 个答案:

答案 0 :(得分:1)

  

输出显示每次通话的增量。究竟是什么原因   在这背后?

默认情况下不会初始化具有自动存储分配的变量,而是访问未初始化变量的未定义行为。这意味着无法推断出第二个程序的行为。

另请注意,函数范围中的默认存储类变量是自动的。因此,您不需要auto关键字来限定i的定义。

// in function scope

auto int i;
// equivalent to
int i;

另外,说

是错误的
  

所以,当我第二次调用这个func()函数时   i的值将重新初始化为1。

变量i未重新初始化。一旦包含它的函数返回,它就会超出范围。再次调用该函数时,它再次在堆栈上分配。 这并不意味着它被分配在相同的内存地址上。

此外,您需要处理函数的返回类型和参数列表。隐式返回类型是int,空参数列表表示没有关于参数的数量和类型的信息,这意味着该函数采用固定但未知数量的未知类型的参数。您应该始终在参数列表中明确提及void,以表示该函数不带参数。

#include <stdio.h>

// prototype of the function func
void func(void);

// main should have one of the below signatures - 
// int main(void); or 
// int main(int argc, char *argv[]);
int main(void)
{
  func();
  func();
  func();
}

// explicitly mention void in the 
// parameter list to mean the function
// takes no argument
void func(void)
{
  // using auto keyword is redundant because 
  // local variables have automatic storage allocation
  int i = 1;
  printf("i = %d", i);
  i = i + 1;
}

答案 1 :(得分:0)

在第二种情况下,您可以使用i而无需初始化它。

因此语言未定义该值。您看到值递增模式的事实是您正在使用的特定编译器的工件。

在第一次迭代中,您有一个随机看似值,恰好位于i所代表的内存位置。您的函数会递增该内存位置的值,然后该内存位置恰好用于后续调用。