【问题标题】:How to utilize sizeof() to return the size of malloc buffer allocation [duplicate]如何利用 sizeof() 返回 malloc 缓冲区分配的大小 [重复]
【发布时间】:2016-10-19 19:36:14
【问题描述】:

如果我分配:

int *d =  malloc(5* sizeof(int));
printf("%d", (int) sizeof(d));

我得到的值是 8 而不是 5。我知道 sizeof() 在这种情况下并不意味着返回长度,但我想知道是否有解决方法,因为我想避免手动跟踪大小(通过参数传递)。

【问题讨论】:

  • d 是一个指针,您正在获取它的大小。这就是为什么。
  • “如何使用 sizeof()...”。没有这样的“如何”。没有办法为此目的使用sizeof。
  • sizeof 不是函数,而是运算符。
  • 你知道大小。你只是告诉它分配什么。但是您没有检查返回的指针不是NULL。如果是,则分配了 0 个字节。否则,它会分配您请求的 5* sizeof(int) 字节。

标签: c


【解决方案1】:

sizeof(d) 给出指针的大小,d。 8 的值与 64 位主机系统一致。

这与分配的d 指向的大小不同。

由于malloc()是在运行时分配的(要分配的长度在程序运行时指定),而sizeof是编译时运算符,所以不能使用sizeof来获取长度。

您需要在单独的变量中手动跟踪大小。

  size_t allocated_size = 5*sizeof int;
  int *d = malloc(allocated_size);
  printf("%d", (int) allocated_size);

更常见的是跟踪元素的数量(即考虑d 的类型)。

  size_t allocated_ints = 5;
  int *d = malloc(allocated_ints * sizeof (*d));
  printf("%d", (int) allocated_ints);   // prints number of `int`

size_t 在<stdlib.h> 中定义(等等)。在 C99 及更高版本中,用于打印 size_t 的格式说明符是 %zu(而不是像您所做的那样转换为 int 并使用 %d)。

【讨论】:

  • 不错的答案:)。
【解决方案2】:

当sizeof 运算符应用于指针时,它会给出指针本身的大小。它确实不给出它可能指向的数组的大小。

动态分配数组时,需要手动跟踪分配了多少元素。

【讨论】:

  • When a pointer is passed to sizeof 听起来sizeof 是一个函数:D
【解决方案3】:

sizeof 无法提供您想要的信息。您必须自己跟踪。

【讨论】:

    【解决方案4】:

    C 不会为您跟踪已分配缓冲区的大小。您必须手动跟踪尺寸。

    【讨论】:

      【解决方案5】:

      您应该首先决定要分配多少内存,然后在常量或变量中跟踪它。

      const size_t sz = 5 * sizeof(int);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        相关资源
        最近更新 更多