如何在C 中动态分配二维数组

2008-02-23 05:39:51来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  这个问题应该是我以前在CSDN蹭分时回答次数比较多的一个问题了,我的回答一般是三种方法:(1)用vector的vector,(2)先分配一个指针 数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,能够用a[x][y]这样的写法,缺点是他相当于C#中的一个锯齿 数组,内存空间不连续。(3)直接分配一个x*y大小的一维数组,这样确保空间是连续的,但访问数组元素不直观。对于我这个“经典”回答,我那时还一直是 挺得意的,至少从蹭分的角度来看,这样回答还是很有效的。

  今天在ChinaUnix论坛闲逛时看到一个贴子,再次证实了我在C 方面才疏学浅。

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  void **darray_new(int row, int col, int size)
  {
   void **arr;
   arr = (void **) malloc(sizeof(void *) * row size * row * col); if (arr != NULL)
  {
       void *head;
       head = (void *) arr sizeof(void *) * row;        memset(arr, 0, sizeof(void *) * row size * row * col);    while (row--)
            arr[row] = head size * row * col;
     }
       return arr;
  }
  void darray_free(void **arr)
  {
     if (arr != NULL)
    free(arr);
  }

  嗯,连续分配内存,而且能够用a[x][y]的方式来访问!可谓二维数组动态分配的绝妙方法!这段程式是C的,似乎要改成支持对象分配的C 版也不是什么难事(但是估计得用上placement new吧,嗯,需要再思考一下……)。

  2007-06-13 12:38 补充:

  经过试验,C 版出炉了:)关键点还是在于placement new和显示的析构函数调用,用于确保对象能够正常的构造和析构。
  这个实现也还是有不少缺点的,比如,数组的大小必须记住,才能确保析构任何对象。但是这点能够通过改进分配方法算法,把数组大小也用一点空间保存起来。
  另一个缺点是,从语法上看,很容易让人误把darray_new返回的指针以为是数据区的起始地址,从而可能导致一些逻辑错误。

  #include <iostream>
  #include <cstdlib>
  #include <new>

  template <typename T>
  T **darray_new(int row, int col)
  {
   int size = sizeof(T);
   void **arr = (void **) malloc(sizeof(void *) * row size * row * col);
   if (arr != NULL)
   {
   unsigned char * head;
   head = (unsigned char *) arr sizeof(void *) * row;
   for (int i = 0; i < row; i)
   {
   arr[i] = head size * i * col;
   for (int j = 0; j < col; j)
   new (head size * (i * col j)) T;
   }
  }
  return (T**) arr;
  }

  template <typename T>
  void darray_free(T **arr, int row, int col)
  {
   for (int i = 0; i < row; i)
   for (int j = 0; j < col; j)
  arr[i][j].~T();
  if (arr != NULL)
  free((void **)arr);
  }




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: c研发策略-之-错误处理

下一篇: C/C 如何在程式中加载JPG图片?[1]

热门词条
热门标签