C、函数完成后的变量会发生什么变化?

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() 吗?

谢谢!

Mit*_*ler 5

在 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);.