【问题标题】:why calloc pointer type is void *? [duplicate]为什么calloc指针类型是void *? [复制]
【发布时间】:2016-10-13 03:27:23
【问题描述】:

我在读一本 C 书。但听不懂的句子是

如果调用calloc成功,则返回指向内存中数组基址的void*指针;

这里,如果void*类型的指针指向内存中数组的基数,那么array[0]的类型是void??

我想知道是什么意思...

谢谢大家阅读我的问题,希望得到答案!

【问题讨论】:

标签: c arrays pointers


【解决方案1】:

我知道既然int * 指向int,那么void * 应该指向void 是多么诱人。但事实并非如此。 void * 和 void 之间确实没有有用的关系,因此最好将它们视为单独的概念。

void * 在 C 中表示指向未指定类型对象的指针。如果您熟悉它,可以将其视为 Java Object 的 C 类似物。

void * 具有以下属性:

  • 任何指针类型都可以与void *相互转换,即void *足以容纳任何指针,即使在指向不同类型的指针可以具有不同大小的机器上也是如此。

    李>
  • void * 和其他指针类型之间的转换是隐式的,您不必进行显式转换。

  • 不允许取消引用void *,即我们必须在访问它指向的内存之前将其转换为具体的指针类型。

  • 您不能在标准 C 中对 void * 进行地址运算,尽管 GCC 允许您将其作为文档化扩展来执行。

void * 是需要处理任意数据的函数的选择类型,例如 calloc()。

【讨论】:

    【解决方案2】:

    calloc 返回void* 因为:

    1. calloc 可用于为任何类型的对象分配内存。
    2. void* 可以隐式转换为其他指针类型。

    如果你使用:

    void* ptr = calloc(...);
    

    它是有效的,但你不能使用*ptr。 void* 不可取消引用 必须将指针转换为其他类型才能取消引用。例如

    char* cptr = ptr;
    *cptr = 'a';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2011-12-29
      • 2012-03-27
      • 2013-05-14
      • 2013-06-05
      • 1970-01-01
      • 2021-04-08
      • 2016-06-02
      相关资源
      最近更新 更多