【问题标题】:How to get the size of dynamically allocated 2d array如何获取动态分配的二维数组的大小
【发布时间】:2012-09-20 00:38:15
【问题描述】:

我已经动态分配了二维数组。 这是代码

int **arrofptr ;
arrofptr = (int **)malloc(sizeof(int *) * 2);
arrofptr[0] = (int *)malloc(sizeof(int)*6144);
arrofptr[1] = (int *)malloc(sizeof(int)*4800);

现在我必须知道在 arrofptr,arrofptr[0],arrofptr[1] 中分配了多少字节? 有什么办法知道大小吗?

如果我们要打印

sizeof(arrofptr);
sizeof(arrofptr[0]);
sizeof(arrofptr[1]);

然后它会打印 4.

【问题讨论】:

  • 不,您只需要自己跟踪。
  • 指针的大小通常是4,这就是你得到4的原因。分配的字节在malloc(...) 的参数中,在你的情况下这些是sizeof(int) * 6144sizeof(int) * 4800... ... ...
  • 这不是一个二维数组,它是一组分段数组,带有一个指针数组来跟踪它们。有关如何正确动态分配二维数组的信息,read this。另外,你应该never typecast the result of malloc

标签: c arrays 2d sizeof dynamic-allocation


【解决方案1】:

你找不到arrofptr的大小,因为它只是一个指向指针的指针。您正在使用它定义一个数组数组。没有办法只用指针告诉size信息,需要自己维护size信息。

【讨论】:

    【解决方案2】:

    您从malloc() 获得的唯一返回值是指向分配区域的第一个字节的指针(或NULL 失败时)。 no 是可移植的、标准的从这样的指针获取相关分配大小的方法,所以通常答案是 no

    C 方法通常用一对值来表示数组和缓冲区:基地址和大小。顺便说一下,后者通常是 size_t 类型,与 malloc() 的参数相同。

    【讨论】:

      【解决方案3】:

      如果您想跟踪已分配代码块的大小,则需要将该信息存储在您分配的内存块中,例如

      // allocate 1000 ints plus one int to store size
      
      int* p = malloc(1000*sizeof(int) + sizeof(int)); 
      *p = (int)(1000*sizeof(int));
      p += sizeof(int);
      
      ...
      
      void foo(int *p)
      {
        if (p)
        {
          --p;
          printf( "p size is %d bytes", *p );
        }
      }
      

      替代。放入一个结构体

      struct
      {
        int size;
        int *array;
      } s;
      

      【讨论】:

        【解决方案4】:

        您无法在 C(二维或其他)中获取动态分配数组的长度。如果您需要该信息,请在最初分配内存时将其保存到变量(或至少一种计算方法)中,并将指向内存的指针和内存大小一起传递。

        在您上面的测试用例中,sizeof 正在返回指针的大小,因此您的计算指针的大小通常为 4,这就是为什么您得到 4 并且很可能总是得到 4 的微不足道的结果。

        【讨论】:

          猜你喜欢
          • 2013-09-05
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 2013-11-24
          • 1970-01-01
          • 2011-04-11
          • 1970-01-01
          相关资源
          最近更新 更多