为什么calloc指针类型是void *?

时间:2016-10-13 03:27:24

标签: c arrays pointers

我正在读一本C书。但是无法理解

的句子

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

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

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

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

2 个答案:

答案 0 :(得分:5)

我可以看到,如果int *指向int,那么void *应该指向void是多么诱人。但事实并非如此。 void *void之间确实没有用处,因此最好将它们视为单独的概念。

C中的

void *表示指向未指定类型的对象的指针。如果你熟悉它,你可以把它想象成Java Object的C类似物。

void *具有以下属性:

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

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

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

  • 您无法对标准C中的void *进行地址算术,但GCC允许您将其作为文档扩展名进行。

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

答案 1 :(得分:3)

calloc返回void*,因为:

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

    void* ptr = calloc(...);
    

    它有效,但您无法使用*ptrvoid*不可解除引用指针必须转换为其他类型才能解除引用。 E.g。

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