fj1*_*23x 3 c memory performance stack
假设以下代码:
void foo()
{
int i = 5;
printf("%d", i);
}
int main()
{
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我调用 foo 时,"i" 被声明并设置为 5,当这个函数完成时,"i" 变量被释放?
我可以在没有内存泄漏风险的 while(1) 循环中调用 foo() 吗?
谢谢!
在 C 语言中,变量有一个作用域,即它们所属的代码区域,如循环或函数。在这种情况下,变量的范围是您的函数。
当到达变量范围的末尾时,您的变量将被释放。这意味着您的变量使用的内存被释放。因此,在您的函数结束时,您分配的唯一内存空间(用于存储整数的空间)被释放。
要继续讨论标题中的一般问题,您还可以分配将在声明范围之外持续存在的内存。
void foo()
{
int i = 5;
int* j = (int*) malloc(sizeof(int));
*j = i*2
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
例如,在上面的代码中,i 和 j 变量都将在函数结束时被释放。
然而,j 是一个指针,它是包含将被释放的指针的内存空间,而不是包含 j 指向的实际值的内存空间(即使没有为 *j 分配值也是如此)。
为了避免内存泄漏,您必须free(j)在退出函数之前调用。
如果函数返回的是 anint*而不是 type void,您也可以return j而不是释放它,因此您仍然可以访问 j 指向的内存区域,在那里您调用了此函数。这样做,您将能够使用该值,然后通过调用free(j);.