假设以下代码:
void foo()
{
int i = 5;
printf("%d", i);
}
int main()
{
foo();
return 0;
}
当我调用foo函数时,“i”被声明并设置为5,当该函数结束时,“i”变量会被释放吗?
我可以在while(1)循环中调用foo()函数而不会有内存泄漏的风险吗?
谢谢!
假设以下代码:
void foo()
{
int i = 5;
printf("%d", i);
}
int main()
{
foo();
return 0;
}
void foo()
{
int i = 5;
int* j = (int*) malloc(sizeof(int));
*j = i*2
printf("%d", i);
}
free(j)
。int*
而不是void
类型,您也可以使用return j
而不是释放它,这样您仍然可以访问在调用此函数时指向j的内存区域。这样做,您就可以使用该值并稍后通过调用free(j)
来释放所使用的内存空间。int i = 5;
这行代码在栈上声明了一个int类型的变量。在栈上声明的变量会在超出作用域时释放其内存。当函数结束时,i
也将超出作用域。
因此,您可以反复调用该函数而不会发生内存泄漏。
你不需要关心,相信 i
会消失。在我所知道的所有实现中,本地的 i
要么在一个寄存器中被重用,要么在一个堆栈帧中被弹出。例如,可以查看 调用堆栈 的维基页面,其中提供了一张很好的图片。
据我所知,C99 标准规范中没有确切要求使用堆栈,但我不知道有哪个实现不使用任何堆栈。
因此,当然可以在 main
中的循环中调用 foo
。
我建议您使用所有警告和调试信息编译代码(例如 gcc -Wall -g
),并使用调试器(例如 gdb
)逐步运行程序并显示 i
的地址。