免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2850 | 回复: 3
打印 上一主题 下一主题

堆中实现数组探讨 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-27 16:52 |只看该作者 |倒序浏览
这是接上一篇 “多维数组如何在堆中申请明??”的话题。



  1. 可以先申请足够的空间,然后转换成你所要的任何类型空间。
  2. #include <stdlib.h>;
  3. #include <stdio.h>;

  4. typedef short int int16;

  5. void   *buf;
  6. int    *nInt[5];  //[5][10]
  7. int16  *nInt16;   //[5]

  8. int init()
  9. {
  10.   int i;

  11.   buf = malloc( 5*10*sizeof(int)+5*sizeof(int16) );
  12.   if( buf == NULL ) return -1;

  13.   bzero( buf, 5*10*sizeof(int)+5*sizeof(int16) );

  14.   for( i=0; i<5; i++ )
  15.     nInt[i] = buf+10*sizeof(int);

  16.   nInt16 = buf + 5*10*sizeof(int);

  17.   return 0;
  18. }

  19. int main()
  20. {
  21.   int i,j;
  22.   if( init() ){
  23.     printf("Init Error\n");
  24.     return -1;
  25.   }

  26.   printf("Init OK.\n" );

  27.   for( i=0; i<5; i++ ){
  28.     for( j=0; j<10; j++ )
  29.       nInt[i][j] = i*j;
  30.     nInt16[i] = i;
  31.   }

  32.   return 0;
  33. }

  34. 这是的二维数组虽然不像直接定义的int Arrary[5][10]那样省内存,而且还要事先初始化,但还是可以将就着就用啦。

  35. 这种用法在共享内存中经常用到,类型可以为任何类型,如struct等
复制代码

论坛徽章:
0
2 [报告]
发表于 2003-02-27 16:52 |只看该作者

堆中实现数组探讨

呵呵,一般是在大小固定或有限空间条件下做的,管理可以相对集中,所以可以对此块内存可以写init(...),destroy(...) 进行管理,自然也就不存在利用率和调整的问题了。但也可以写相关的realloc(...)函数去调整啦,但一般不会这样去用。

APACHE在LINUX下的多进程通信就是这样方式实现的,有时间可以去核实一下。

对于二维数组在堆中实现很麻烦,要写成
int    *nInt[5];  //[5][10]  的方式,char**不是不能实现,只是比较烦如果有realloc(...)就更烦了。

对于字串处理,我写过专门的串处理类,可以在堆中分配空间,要对堆进行专门的管理,后来我又不用那个类了,因为这样意义并不太大,而是在申请空间时直接申请若干个页面,这样就不至于有页面无法释放的问题了。

无双,JohnBull,zhutr  不知你们在写应用程序特别是后台程序时不知可有对字串及内存申请方面的使用原则?

论坛徽章:
0
3 [报告]
发表于 2003-02-28 08:34 |只看该作者

堆中实现数组探讨

没有啊

如果是多给数组
并且很大
而要在堆中才能分配的话

那么会把它看成是一维数组分配


我是这样做的

论坛徽章:
0
4 [报告]
发表于 2003-02-28 12:18 |只看该作者

堆中实现数组探讨

其实应用 char ** 并没有多大的意义(我的意思是不好理解:可以是

char *a[5],也可理解为 char (*a)[5]),关键是看应用的场合及个人风格。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP