c - 当内存不足时,如何防止变长数组崩溃?

标签 c arrays variable-length

在支持可变长度数组之前,我会像这样动态分配它们:

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/54490402/

相关文章:

javascript - 在没有 length 属性的变量上使用 .length 会导致崩溃

c - Linux 上的存档文件在哪里?

python - 在python中调用C程序函数-段错误

c - 奇怪的.C 文件

java - 如何将我的随机值放入java中的数组中?

R代码高斯混合——数值表达式有2个元素: only the first used

c - 如何使用类似容器的方式在 C 中添加可变长度数据

复合文字和指针

javascript - 通过键名从对象数组中删除重复的对象

java - 给定大小为 n 的数组中 r 个元素在条件下的所有可能组合