微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 中的数组初始化是否需要空检查? C 中的数组初始化会失败吗?

如何解决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 是一个与数组本身分离的指针对象,但事实并非如此。

当你通过malloccalloc动态分配内存时,比如

int *sigcheck = calloc( 5,sizeof *sigcheck );

那么(假设请求成功)你在内存中得到的是

          +---+
sigcheck: |   | ---+
          +---+    |
            +------+
            |  
            V
          +---+
          |   | sigcheck[0]
          +---+
          |   | sigcheck[1]
          +---+ 
           ...
          +---+
          |   | sigcheck[4]
          +---+

在这种情况下,sigcheck 一个与数组元素不同的对象。并且因为如果内存请求不能得到满足,malloccallocrealloc 将返回 NULL,那么您确实需要做一个 { {1}} 检查 NULL

sigcheck
,

来自 malloc 的文档:

如果函数未能分配请求的内存块,则返回空指针。

因此您应该检查 malloc 是否准确地返回 NULL,因为它可能无法为您分配请求的块(尽管这通常不太可能)。

静态分配不会在幕后调用 calloc,因为这会在 上而不是在 堆栈 上分配您的数组。静态分配所需的空间是在编译时确定的,如果无法分配足够的内存量,您的程序将无法加载。看看this question

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。