手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  这个问题应该是我以前在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);
  }




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS