【问题标题】:Getting the size of a malloc only with the returned pointer仅使用返回的指针获取 malloc 的大小
【发布时间】:2012-08-21 08:20:25
【问题描述】:

我希望能够改变数组的大小,所以我以这种方式创建了一个:

int* array;
array = malloc(sizeof(int)*10);//10 integer elements

我可以像往常一样使用这个数组,但是当我尝试像这样找到它的大小时:

size = sizeof(array)/sizeof(int);

我得到答案 1,因为它没有将其识别为指向数组

如何获取数组的大小? (我知道它在技术上不是一个数组,但有没有办法计算出分配的内存块的整个大小?)

我是否也正确地假设了我在描述中所说的内容?如果我在技术上存在错误,请纠正我。

【问题讨论】:

  • 你做不到。 sizeof 不知道 malloc

标签: c arrays pointers malloc sizeof


【解决方案1】:

指针指针,而不是数组。它永远不能被“识别为数组”,因为它不是数组

完全由来记住数组的大小。

例如:

struct i_must_remember_the_size
{
    size_t len;
    int * arr;
};

struct i_must_remember_the_size a = { 10, NULL };
a.arr = malloc(a.len * sizeof *a.arr);

【讨论】:

  • 如果实际上不知道使用malloc 分配的大小,free(arr) 如何知道要释放多少内存?
  • @Zulakis:free 只是通知系统分配器指针值对应的分配已被释放。由系统分配器的实现来保留足够的簿记信息以理解该请求。例如,如果分配器维护不同大小的 arena,则指针值本身可以指示它来自哪个 arena。
【解决方案2】:

没有标准的方法来满足您的要求。一些编译器可能为此提供了一个函数,或者一些其他分配器可能有这样一个函数,但是,正如已经说过的,没有什么标准。

请注意,应用于数组的sizeof 不起作用,因为它将指针识别为“来自数组”:它只是将其参数识别为数组(sizeof 是数组执行的少数上下文之一不衰减到指向其第一个元素的指针);一旦你的数组衰减到一个指针 sizeof 只会产生指针的大小。

【讨论】:

    【解决方案3】:

    首先,sizeof() 返回一个“类型”的大小;它对分配的内存一无所知。

    其次,没有办法获得 malloc()ed 块的大小,除非您想深入了解编译器运行时库的内部结构。这绝对不是一个好主意,特别是因为在其他地方记住大小是没有问题的——你可以在内存块前面加上另一个项目来存储大小,或者你可以单独存储它。

    【讨论】:

      【解决方案4】:

      在 C 标准和可移植中,这是不可能的。请注意,一些编译器提供了非标准扩展(跟踪它,例如msize)。

      此外,sizeof 运算符无法告诉您块的大小,因此它会产生指针的大小(请记住,sizeof 在编译时运行,除了可变长度数组)。

      所以你必须保持分配的大小,例如在数据结构中,例如:

      #include <stddef.h>
      
      typedef struct {
          int   *p;
          size_t n;
      } array;
      

      【讨论】:

        【解决方案5】:

        使用指向数组的类型而不是指向元素的类型:

        int (*parray)[10] = malloc(sizeof *parray);
        

        然后sizeof *parray 会为您提供所需的答案,但您需要使用* 运算符访问数组,如(*parray)[i](或等效的,尽管令人困惑,parray[0][i])。请注意,在现代 C 中,10 可以替换为变量。

        【讨论】:

        • “现代 C”——具体来说,C99(和 C11)支持 VLA。
        猜你喜欢
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2018-09-08
        相关资源
        最近更新 更多