函数中使用的自动 存储不会重新初始化使用 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
输出显示每次通话的增量。这背后的确切原因是什么?
答案 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
所代表的内存位置。您的函数会递增该内存位置的值,然后该内存位置恰好用于后续调用。