如何解决C 中的数组初始化是否需要空检查? C 中的数组初始化会失败吗?
我知道在 C 中,每次调用 malloc() 或 calloc() 时检查 NULL 指针是一种很好的做法。我必须对数组初始化做同样的事情吗?例如:
int sigcheck[5];
if (sigcheck == NULL) {return;}
需要第 2 行吗?如果我没记错的话,数组初始化的工作原理就像在后台调用 calloc() 一样,这个底层功能是否考虑了 NULL 的可能性,还是我们自己做这件事是必要的/好的做法。>
解决方法
最好在每次调用 malloc() 或 calloc() 时检查 NULL 指针
是的,因为这些函数被记录为在失败时返回 NULL。这是唯一的原因。
我是否必须为数组初始化做同样的事情
没有
需要第 2 行吗?
不,这没有任何意义。数组不能有空地址,它总是在某处保存一个内存位置 - 它最终取决于 C 调用的内容存储持续时间。在这种情况下,它要么具有静态存储持续时间,要么具有自动存储持续时间,具体取决于它是在函数外部还是在函数内部分配。
如果我没记错的话,数组初始化就像在后台调用 calloc() 一样
你错了。 calloc
是程序员用于显式内存分配的一种特殊情况,称为分配的存储持续时间。 malloc
函数系列从不被隐式或静默调用。 (除非您调用声称依次调用 malloc
的函数,例如 strdup
。)
您可能会发现这个问题很有趣:A program uses different regions of memory for static objects,automatic objects,and dynamically allocated objects
,数组的内存分配就像任何其他变量类型的内存一样 - 引擎盖下没有单独的 calloc
或类似的调用。行后
int sigcheck[5];
你最终得到的是什么
+---+
sigcheck: | | sigcheck[0]
+---+
| | sigcheck[1]
+---+
...
+---+
| | sigcheck[4]
+---+
因此,在这种情况下,无需对 NULL
执行 sigcheck
检查。
人们感到困惑的是,在大多数情况下,表达式 sigcheck
将被转换或“衰减”,从类型“int
的 5 元素数组”到输入“指向int
的指针”,表达式的值将是数组第一个元素的地址。这个概念经常被混淆,以至于人们认为 sigcheck
是一个与数组本身分离的指针对象,但事实并非如此。
当你通过malloc
或calloc
动态分配内存时,比如
int *sigcheck = calloc( 5,sizeof *sigcheck );
那么(假设请求成功)你在内存中得到的是
+---+
sigcheck: | | ---+
+---+ |
+------+
|
V
+---+
| | sigcheck[0]
+---+
| | sigcheck[1]
+---+
...
+---+
| | sigcheck[4]
+---+
在这种情况下,sigcheck
是 一个与数组元素不同的对象。并且因为如果内存请求不能得到满足,malloc
、calloc
和 realloc
将返回 NULL
,那么您确实需要做一个 { {1}} 检查 NULL
:
sigcheck
,
来自 malloc 的文档:
如果函数未能分配请求的内存块,则返回空指针。
因此您应该检查 malloc
是否准确地返回 NULL
,因为它可能无法为您分配请求的块(尽管这通常不太可能)。
静态分配不会在幕后调用 calloc
,因为这会在 堆 上而不是在 堆栈 上分配您的数组。静态分配所需的空间是在编译时确定的,如果无法分配足够的内存量,您的程序将无法加载。看看this question。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。