免费注册 查看新帖 |

Chinaunix

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

[code] C简单实现动态2维数组 :) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-08 16:33 |只看该作者 |倒序浏览
这也是近期编写 libscws 时用到的一个小功能,动态2维数组。

struct xxx **x;
x = (struct xxx **) darray_new(5, 4, sizeof(struct xxx));

...
这里就可以用 x[1][3]  ... x[0][3] ... 来操作了:)
...

darray_free(x);



  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void **darray_new(int row, int col, int size)
  5. {       
  6.         void **arr;

  7.         arr = (void **) malloc(sizeof(void *) * row + size * row * col);
  8.         if (arr != NULL)
  9.         {
  10.                 void *head;

  11.                 head = (void *) arr + sizeof(void *) * row;
  12.                 memset(arr, 0, sizeof(void *) * row + size * row * col);
  13.                 while (row--)               
  14.                         arr[row] = head + size * row * col;               
  15.         }
  16.         return arr;
  17. }

  18. void darray_free(void **arr)
  19. {
  20.         if (arr != NULL)
  21.                 free(arr);       
  22. }

复制代码

论坛徽章:
0
2 [报告]
发表于 2007-06-08 16:40 |只看该作者
你是牛人

论坛徽章:
0
3 [报告]
发表于 2007-06-08 17:11 |只看该作者
libscws 简易中文分词模块?

论坛徽章:
0
4 [报告]
发表于 2007-06-08 17:12 |只看该作者
我能想到只能到这个程度,达不到LZ的效果。
int (*ap)[3];
ap = (int (*)[3])malloc(sizeof(int) * 3 * 4);
ap[2][1] = 99;


不过c99里面可以这么干:

int col = 2;
int row = 3;
typedef int tp;

tp (*ap)[row];
ap = (tp (*)[row])malloc(sizeof(tp) * col * row);
ap[0][1] = 9;

[ 本帖最后由 yuanchengjun 于 2007-6-8 18:02 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-08 18:54 |只看该作者
原帖由 yuanchengjun 于 2007-6-8 17:12 发表
我能想到只能到这个程度,达不到LZ的效果。
int (*ap)[3];
ap = (int (*)[3])malloc(sizeof(int) * 3 * 4);
ap[2][1] = 99;


不过c99里面可以这么干:

int col = 2;
int row = 3;
typedef int tp;

...


何苦呢?

  1. int a, b;
  2. scanf("%d %d", &a, &b);
  3. int x[a][b];
复制代码

论坛徽章:
0
6 [报告]
发表于 2007-06-08 19:10 |只看该作者
原帖由 doctorjxd 于 2007-6-8 17:11 发表
libscws 简易中文分词模块?


是的. API 说明已经编写完毕,源码整理中待发布...
http://www.hightman.cn/bbs/viewt ... &extra=page%3D1

论坛徽章:
0
7 [报告]
发表于 2007-06-08 19:16 |只看该作者
原帖由 nully 于 2007-6-8 18:54 发表


何苦呢?

  1. int a, b;
  2. scanf("%d %d", &a, &b);
  3. int x[a][b];
复制代码


?这个代码能执行吗,怀疑中。编译一下看看?

论坛徽章:
0
8 [报告]
发表于 2007-06-08 19:17 |只看该作者
C99支持

论坛徽章:
0
9 [报告]
发表于 2007-06-08 19:22 |只看该作者
原帖由 antigloss 于 2007-6-8 19:17 发表
C99支持

恩,开始感觉很奇怪,试了一下,是可以的。
:)

论坛徽章:
0
10 [报告]
发表于 2007-06-08 19:28 |只看该作者
原帖由 hightman 于 2007-6-8 19:10 发表


是的. API 说明已经编写完毕,源码整理中待发布...
http://www.hightman.cn/bbs/viewt ... &extra=page%3D1


支持楼主!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP