作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在支持可变长度数组之前,我会像这样动态分配它们:
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;
}
但是现在我没有“内存不足”检查。事实上,如果 n 太大,程序就会崩溃。
如果 n 太大,我如何从 bar(n) 中优雅地退出?
最佳答案
情况与任何其他局部变量完全相同 - 像这样的声明:
int baz(void)
{
int arr[100000];
.
. do stuff with arr[]
.
return 0;
}
有完全相同的问题。 “解决方案”一如既往——不要递归太深,也不要分配具有自动存储持续时间的非常大的数据结构(在这些情况下继续使用 malloc()
). “非常大”的值在很大程度上取决于您的环境。
换句话说,不要声明 int array[n];
除非你知道 n
有一个合理的值,这样你会很高兴将该最大大小的数组声明为普通的非可变修改类型数组。
(是的,这意味着可变修改的类型数组并不像它们最初出现时那样有用,因为与仅将数组声明为所需的最大大小相比,您的 yield 微乎其微)。
关于c - 当内存不足时,如何防止变长数组崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4151172/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!