【问题标题】:is it necessary to type-cast malloc and calloc [duplicate]是否有必要对 malloc 和 calloc 进行类型转换 [重复]
【发布时间】:2012-10-28 13:57:17
【问题描述】:

可能重复:
Do I cast the result of malloc?

我在谷歌上搜索找出 ma​​lloccalloc 类型转换的原因。但是,我只发现 ma​​lloc 的类型转换是不必要的,因为它返回 void 指针,但是 calloc 呢。这也是 calloc 的相同原因???

现在,如果我们回到第一点,关于 ma​​lloccalloc 的返回值。然后,我发现,两者都返回了分配的空间。所以,我在这里有点困惑。所以,我的问题是

  1. ma​​lloccalloc

  2. 的返回值是多少
  3. 是否需要强制类型转换 ma​​lloccalloc。为什么?

【问题讨论】:

  • @hmjd 可能是.. 但在这里我也要求malloccalloc
  • 是的,这是重复的,但是编译器越来越讨厌要求您将 void 指针转换为任何其他类型 - 这与 void 指针的原始目的背道而驰,即是一种通用类型,可以转换并分配给任何东西。这是更多的C“进步”。

标签: c malloc calloc


【解决方案1】:

malloc和calloc的返回值是多少?

它是一个指向void (void*) 的指针。

是否有必要对 malloc 和 calloc 进行类型转换。为什么?

不,因为从指向void 的指针到指向对象的指针的转换是隐式的。

C11 (n1570),第 6.3.2.3 节指针
指向void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。

malloccalloc 都适用。

【讨论】:

    【解决方案2】:

    malloc()calloc()返回void *,它可以分配给任何指针类型。在C中没有必要对void*进行类型转换,因为它是由编译器隐式完成的。但在c++中,如果你不会打字

    【讨论】:

      【解决方案3】:

      malloccalloc 的返回值为void*。这些函数分配的堆内存空间的地址。

      这两个函数都分配内存。它们之间的唯一区别是

      • malloc 只是分配内存。
      • calloc分配内存并将其初始化为0。

      在 C 中,不建议强制转换这些函数的返回值。

      在 C++ 中强制转换。

      【讨论】:

        【解决方案4】:

        malloc() 和 calloc() 的返回值是多少?

        void *malloc(size_t size);
        void *calloc(size_t nmemb, size_t size);
        

        void* 由两个函数返回。

        是否有必要对 malloc 和 calloc 进行类型转换。为什么?

        没有。不需要进行类型转换。 malloc()calloc() 函数返回一个指向已分配内存的指针,该指针适合任何类型的变量对齐。出错时,这些函数返回NULLNULL 也可以通过成功调用大小为零的malloc() 或通过成功调用具有nmemb 或大小为零的calloc() 返回。

        【讨论】:

          猜你喜欢
          • 2021-11-27
          • 2023-03-30
          • 2018-05-28
          • 2013-02-13
          • 2011-07-03
          • 2016-05-22
          • 2011-09-15
          相关资源
          最近更新 更多