On this http://en.cppreference.com/w/c/language/storage_duration网站上有以下段落(强调我的):
- 自动存储时间。当进入声明对象的块时分配存储空间,并在通过任何方式(goto、return、到达末尾)退出时释放存储空间。 VLA 是一个例外;它们的存储是在执行声明时分配的,而不是在块条目时分配的,然后释放的当声明超出范围时,而不是退出块时(C99 起)。如果递归地输入块,则为每个递归级别执行新的分配。所有函数参数和非静态块作用域对象以及块作用域中使用的复合文字都具有此存储持续时间。
声明超出范围和块退出有什么区别?你能举个例子吗?
来自 C11 规范的 N1570 草案 §6.2.4/7
对于这样一个确实具有可变长度数组类型的对象,其
生命周期从对象的声明延伸到执行
该程序离开了声明的范围。
然后该规范添加了以下有用的注释:
离开包含声明的最里面的块,或者跳转到
该块中的一个点或声明之前的嵌入块,
离开声明的范围。
因此,当执行超出 VLA 范围(包括 VLA 声明之前同一块中的部分)时,VLA 就会被解除分配。
可以使用以下命令跳转到声明之前的点goto
陈述。例如:
int n = 0;
while (n < 5)
{
top:
n++;
char array[n];
if (n < 2)
goto top;
}
在此代码中,当goto
被执行。然而,价值n
变化,所以一个新的array
需要分配。这就是规范试图支持的极其复杂的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)