gpt4 book ai didi

c - 为什么不需要释放静态数组?

转载 作者:太空狗 更新时间:2023-10-29 16:22:25 26 4
gpt4 key购买 nike

我想知道为什么不需要释放静态数组?我知道在创建动态数组时,例如

int *p;
p = malloc(10*sizeof(int));

我们必须使用以下方法释放分配的内存:

free(p);

而对于函数中的静态数组,调用函数结束时,静态数组会自动释放。

我不明白的是:当使用这样的函数返回静态数组时:

int *subFunc(){
static int a[5] = {1,2,3,4,5};
return a;
}

int main(){
int *p;
p = subFunc();
}

如果静态数组在执行完成后自动释放,那我们如何还能正确访问静态数组的值呢?

最佳答案

If the static array is automatically freed after completing the execution, then how can we still access the values of the static array correctly?

不,不是这样的。 static 变量在开始 main() 之前被初始化,它的生命周期是整个程序的执行。因此,它们可以从函数(定义它们的地方)returned 并且仍然可以被访问。它们不是本地(对于函数而言),当函数完成执行时,它们将超出生命周期。

相关,引用自C11,章节§6.2.4

An object whose identifier is declared without the storage-class specifier _Thread_local, and either with external or internal linkage or with the storage-class specifier static, has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup.

关于函数内部static变量的范围,是的,它仅限于函数本身,如§6.2.1章节所述,

[...] If the declarator or type specifier that declares the identifier appears inside a block or within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the end of the associated block. [...]

这意味着,显然,您不能在 subFunc() 之外使用数组 a,因为 a 不是可见的subFunc() 之外。

但是,当您返回 数组时(返回数组会导致指向数组第一个元素的指针衰减,FWIW),因为 static 数组是整个程序的执行,访问返回的指针(当然,在范围内)是完全有效和合法的。

关于c - 为什么不需要释放静态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37131659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com