0

函数中使用的自动 存储不会重新初始化使用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

检查以下New.c程序。

New.c :包含main()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

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

4

2 回答 2

1

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

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

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

// in function scope

auto int i;
// equivalent to
int i;

还有,说的不对

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

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

此外,您需要注意函数的返回类型和参数列表。隐式返回类型 isint和空参数列表意味着没有关于参数的数量和类型的信息,这意味着该函数采用固定但未知数量的未知类型的参数。您应该始终在参数列表中明确提及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;
}
于 2014-05-07T06:30:57.750 回答
0

在第二种情况下,您在i没有初始化它的情况下使用它。

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

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

于 2014-05-07T06:29:56.567 回答