【问题标题】:malloc function return pointer to an array right?malloc 函数返回指向数组的指针吗?
【发布时间】:2020-08-11 14:41:59
【问题描述】:

我有一个疑问。当malloc()函数返回一个指针时,它是指向线性内存块的指针吗(类似于数组)?还是别的什么?

我想知道那段记忆的结构

【问题讨论】:

  • 是的,它是一个指向线性连续内存块的指针。该块的大小由传递给malloc的函数参数确定。
  • 为什么你不阅读描述malloc系统调用的man7?不管怎样malloc() 函数分配size 字节(在调用时传递)并返回一个指向分配内存的指针。它可以是整数数组或结构数组或其他任何东西!内存未初始化。继续阅读这里malloc_man7

标签: c pointers malloc


【解决方案1】:

我想知道那段记忆的结构。

没有结构。只是内存块

(类似于数组?)

内存块与数组完全相同。

区别只是那个块的引用是一个指针。

  1. 您不能使用 `sizeof 运算符来获取该内存块的大小。
  2. 指针的引用与内存块的引用不同。 (数组的地址总是引用数组的第一个元素)

【讨论】:

    【解决方案2】:

    指针仅指向所指向类型的单个对象(尽管该对象可能是聚合类型)或函数。该对象可能是像数组这样的更大序列中的第一个对象,但您无法从指针本身知道这一点。给定代码,如

    char x;
    char *p1 = &x;
    char *p2 = malloc( sizeof *p2 * 10 );
    

    无法从指针本身知道p1 指向单个独立对象,而p2 指向对象序列中的第一个。您必须单独跟踪该信息。

    这对于指向聚合类型的指针是正确的

    char a[20];
    char (*p3)[20] = &a;
    char (*p4)[20] = malloc( sizeof *p4 * 10 );
    

    与上述相同 - p3p4 都指向char单个 20 元素数组。在p4 的情况下,它指向char 的20 元素数组序列中的第一个,但同样你无法从p4 本身的值中知道这一点。

    请注意,malloccalloc 不是按对象操作的,它们按字节操作 - 你告诉他们要保留多少字节的内存,但他们不知道什么类型的对象或对象序列将占用该内存。他们还需要一些方法来跟踪分配的内容,因此许多实现会在每次分配时保留一些额外的内存用于记账目的。

    【讨论】:

      【解决方案3】:

      malloc 函数返回指向数组的指针对吗?

      size_t n = ...;
      void *p = malloc(n);
      

      当返回的指针是空指针时,分配失败,指针不应该被取消引用。它不需要被释放。

      if (p == NULL) Handle_Failure();
      

      一个成功的void *malloc(size_t n) 调用确实会返回一个指针,一个可以分配给任何对象指针类型的void *。演员表是not neededp 不是一个指向 array 的指针,只是一个 void *。分配的内存可以是任何对象(包括数组)的副本的目的地。

      my_type *p = malloc(n);
      

      使用指针存储数组、int 或任何对象 的内容。只要初始分配足够大,就没有关系。指针满足所有对象类型的对齐要求。完成后,准​​确地释放它一次。然后不要使用指针中的值。然而p 可以重新分配。

      int foo(const struct abc *x) {
        struct abc *p = malloc(sizeof *p);
        if (p == NULL) {
          return 1;
        }
        *p = *x;
        bar(p);
        free(p);
        return 0;
      }
        
      

      0 字节的分配是一种特殊情况,可以做到。如果malloc() 返回一个空指针,则不应取消引用该指针。没有*p


      一旦代码获得p,代码没有有一个可移植的方式来获取分配的内存大小。代码应根据需要跟踪原始nmalloc() 使用 size_t 参数。


      注意:free(NULL) 可以

      【讨论】:

        【解决方案4】:

        malloc();函数返回一个指针时,它是一个指向线性内存块的指针

        是的,它是一个void 指针。

        (类似于数组)。

        没有。它不是一个数组,或者换句话说,它不是指向传递给malloc() 的大小数组的第一个元素的指针。它是一个内存区域/块,实际上是连续的,但返回的指针(或存储返回值的变量)不会具有数组的属性。

        想知道那段记忆的结构

        如果您只想使用返回的内存位置,则无需费心。您可以将返回的指针存储到指向完整类型的指针的变量中,并使用该变量来执行该内存位置的操作(读取/写入)。

        【讨论】:

        • 作为数组的内存块与“malloc”分配的内存块有何不同?
        • @P__J__ 的属性相同,正如您回答的那样。 :)
        • 不,您无法将指向数组的指针作为局部变量或全局变量与指向malloc 返回的内存块的指针区分开来。当然,堆、栈和数据区域的内存区域是不同的。但这取决于实现。
        • 我没有写内存块,它没有任何属性。
        • @harper 这是我在这个答案中不喜欢的。内存块没有任何属性。
        【解决方案5】:

        返回指向数组的指针。

        malloc(size_t n) 返回指向由参数n 指定的连续内存位置的指针。

        请注意,它与 calloc(size_t nmem, size_t size) 相对,后者将每个位初始化为零,而 malloc() 将值保留为不确定的值,如 cmets 中所建议的那样。

        Default value of malloc

        Why malloc may be indeterminate from SO

        More about calloc and malloc from SO

        【讨论】:

        • malloc(int)?我觉得更像是malloc(size_t)
        • opposed to calloc(int, int) which returns a memory allocation with each allocated byte of a specified size. 什么?
        • callocmalloc 相同,返回指向连续和线性内存块的指针。我认为您因为两个参数而感到困惑。我建议您在写答案之前阅读函数的文档。
        • 分配给每个指定大小的字节 嗯?您是否试图暗示字节在运行时的大小可能不同?
        • calloc(int, int) does have a limit on individual element size什么限制?
        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多