函数中的局部变量
Local Variable in Function
我在 C 中发现了一个搞笑的问题。
这是我的代码
#include <stdio.h>
void method()
{
int indx;
printf("%d\n", indx);
indx++;
}
int main(void)
{
method();
method();
method();
}
这是一个简单的例子。
index 变量未初始化。因此,方法函数中 printf 的结果将是一些奇怪的值。
而 indx 是局部变量。所以 indx++ 没用。
但答案是
0
1
2
似乎 indx 仍然存在
我不明白。为什么?
局部变量专门存放在对应函数的内存区,所以每次调用函数时,都可以看到indx值逐个递增。
但是答案returns存储变量的内存值。
局部变量存储在堆栈中。因为您在每个函数调用之间没有执行其他操作,所以堆栈在调用之间基本上保留(未更改),并且缺少初始化意味着 indx
的值是恰好存储在该堆栈位置的任何值。
如果您进行了其他函数调用,堆栈很可能会被覆盖,从而产生 non-sequential 个值,并且很可能不是从零开始的。
堆栈在启动时可能包含零值的一个原因可能是因为,根据编译器、编译器选项和标准库启动,堆栈可能被故意初始化为零(或者只是因为使用的内存区域恰好包含以前申请中的零等)。
永远不要依赖这种行为,它特别是未定义的行为,因此初始化变量并确保您了解变量范围是软件开发中学习的重要内容。
我认为有很多关于如何在软件开发语言中使用堆栈的描述(以及硬件架构和实现之间的可变性),您应该单独研究它们。
我在 C 中发现了一个搞笑的问题。
这是我的代码
#include <stdio.h>
void method()
{
int indx;
printf("%d\n", indx);
indx++;
}
int main(void)
{
method();
method();
method();
}
这是一个简单的例子。
index 变量未初始化。因此,方法函数中 printf 的结果将是一些奇怪的值。
而 indx 是局部变量。所以 indx++ 没用。
但答案是
0
1
2
似乎 indx 仍然存在
我不明白。为什么?
局部变量专门存放在对应函数的内存区,所以每次调用函数时,都可以看到indx值逐个递增。
但是答案returns存储变量的内存值。
局部变量存储在堆栈中。因为您在每个函数调用之间没有执行其他操作,所以堆栈在调用之间基本上保留(未更改),并且缺少初始化意味着 indx
的值是恰好存储在该堆栈位置的任何值。
如果您进行了其他函数调用,堆栈很可能会被覆盖,从而产生 non-sequential 个值,并且很可能不是从零开始的。
堆栈在启动时可能包含零值的一个原因可能是因为,根据编译器、编译器选项和标准库启动,堆栈可能被故意初始化为零(或者只是因为使用的内存区域恰好包含以前申请中的零等)。
永远不要依赖这种行为,它特别是未定义的行为,因此初始化变量并确保您了解变量范围是软件开发中学习的重要内容。
我认为有很多关于如何在软件开发语言中使用堆栈的描述(以及硬件架构和实现之间的可变性),您应该单独研究它们。