Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么calloc指针类型为void*?_C_Arrays_Pointers - Fatal编程技术网

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

为什么calloc指针类型为void*?,c,arrays,pointers,C,Arrays,Pointers,我正在读一本C语言书。但我不明白那个句子是什么 如果调用calloc成功,则返回指向内存中数组基的void*类型指针 这里,如果类型为void*的指针指向内存中数组的基,那么数组[0]的类型为void 我想知道这是什么意思 谢谢大家阅读我的问题,我希望得到答案 calloc返回void*因为: calloc可用于为任何类型的对象分配内存 void*可以隐式转换为其他指针类型 如果您使用: void* ptr = calloc(...); 它是有效的,但不能使用*ptr。Avoid*不可取消引用

我正在读一本C语言书。但我不明白那个句子是什么

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

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

我想知道这是什么意思


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

calloc
返回
void*
因为:

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

    void* ptr = calloc(...);
    
    它是有效的,但不能使用
    *ptr
    。A
    void*
    不可取消引用指针必须转换为其他类型才能取消引用。例如

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

    我可以理解,既然
    int*
    指向
    int
    ,那么
    void*
    应该指向
    void
    ,这是多么诱人的想法。但事实并非如此。在
    void*
    void
    之间确实没有有用的关系,所以最好将它们看作是单独的概念

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

    void*
    具有以下属性:

    • 任何指针类型都可以在
      void*
      之间进行转换,即
      void*
      的大小足以容纳任何指针,即使在指向不同类型的指针大小不同的机器上也是如此

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

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

    • 在标准C中,您不能在
      void*
      上执行地址算术,尽管GCC允许您作为文档化的扩展来执行


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

    请参见在编写
    [0]
    之前将
    void*
    转换为其他指针类型谢谢您的回答!谢谢你的回答!