在支持可变长度数组之前,我会像这样动态分配它们:
int foo(size_t n)
{
int *arr = malloc(n * sizeof int);
if (!arr) return ENOMEM; /* not enough memory */
.
. else do stuff with arr[]
.
free(arr);
return 0;
}
使用可变长度数组,我现在可以让它看起来更干净:
int bar(size_t n)
{
int arr[n];
.
. do stuff with arr[]
.
return 0;
}
But现在我没有“内存不足”检查。事实上,如果 n 太大,程序就会崩溃。
如果 n 太大,我该如何优雅地退出 bar(n) ?
这种情况与任何其他局部变量完全相同 - 声明如下:
int baz(void)
{
int arr[100000];
.
. do stuff with arr[]
.
return 0;
}
有完全相同的问题。 “解决方案”一如既往——不要递归得太深,也不要分配非常大的具有自动存储持续时间的数据结构(继续使用malloc()
对于这些情况)。 “非常大”的值在很大程度上取决于您的环境。
换句话说,不要声明int array[n];
除非你知道n
限制为一个合理的值,这样您会很乐意将该最大大小的数组声明为普通的、不可修改的类型数组。
(是的,这意味着可变修改类型数组并不像它们第一次出现时那么有用,因为与仅以所需的最大大小声明数组相比,您获得的收益很少)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)