c - 是否需要检查没有 malloc() 声明的 C 数组的有效性?

标签 c arrays pointers memory

(如果有人有建议,我会改写标题,我知道这有点尴尬。)

在 C 中使用 malloc() 为动态数组分配内存时,我知道通过验证指针不为 NULL 来检查调用是否成功。是否需要对 C 中显式声明的数组执行相同的检查,例如在以下示例中(取自 this question)?

char arrinit[5];
char (*arrinit_two)[5] = &arrinit;

最佳答案

简而言之:不!

编译器将确保您的数组具有您静态定义的足够内存。

通常(取决于您声明它们的方式),它们将分配在堆栈上,当堆栈上没有足够的内存时,您的程序可能会在您进行任何检查之前崩溃,否则您将不会能够采取任何补救措施。

顺便说一句:无论如何,你也不会得到 NULL 值,因为系统会给你一些地址值,即使没有剩余内存(或者它之前已经崩溃)。

当然有一种情况,您应该小心:当您想要分配非常大量的内存(一个大数组)时,您应该使用 malloc 来分配。在许多系统上,进程的堆栈大小受到限制,因此当您在堆栈上分配大量内存(编译器为您完成)时比使用 malloc 时(因为有不是相同的限制)。

当然,在今天的计算机上,这意味着,在它产生任何影响之前,您可以拥有至少一些 MB 的数组。对于 < 1MB 的数组,您无需费心。

关于c - 是否需要检查没有 malloc() 声明的 C 数组的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666160/

相关文章:

c++ - 矩阵 A 的 boolean 积

javascript - 从数组中导出无序列表

c# - 在 C# 数组中添加和替换元素

c++ - C++中的字符数组

c - 分配作为参数传入的函数指针

c++ - "myType& var = *(myType*) addrVar;"的逆运算是什么(c++)

创建链表+添加新节点+打印列表,但无法弄清楚为什么它不起作用

c - 在堆上使用 unsigned

c - 什么是 glibc GLRO 宏?

c++ - atoi 似乎不能正常工作