免费注册 查看新帖 |

Chinaunix

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

[C] 如何定义可变长度的结构体数组与指针操作? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-11 16:14 |只看该作者 |倒序浏览
定义结构体

typedef struct _node{
     int index;
     char comment[16];
}node,*p_node;


在程序中通过其它途径得到需要分配的结构体数组的标号"x"

使用
p_node_tmp = (p_node)(malloc(sizeof(node)*x));

编译时提示:

“ error: `p_node_tmp' has an incomplete type”
“warning: array 'p_node_tmp' assumed to have one element”



这样好像是不对的。


如果要实现分配可变长度的结构体数组,并使用指针来操作,应该有什么好的方法吗??

求高手给个答案!!!

论坛徽章:
0
2 [报告]
发表于 2008-09-11 16:17 |只看该作者
p_node p_node_tmp;

论坛徽章:
0
3 [报告]
发表于 2008-09-11 16:18 |只看该作者
typedef struct {
   int count;
  char array[0];
} vl_array_t;

论坛徽章:
0
4 [报告]
发表于 2008-09-11 16:25 |只看该作者
原帖由 prc 于 2008-9-11 16:18 发表
typedef struct {
   int count;
  char array[0];
} vl_array_t;


这样定义的结构体是不能完成以下操作的
struct vl_array_t *p;

p = malloc(sizeof(struct vl_array_t)*100);

(p+4).count = 5;

即,用长度为0的数组定义了单个结构体的尾部扩展,但是用指针操作的时候,不能实现结构体数组指针的作用。

我的意思是在使用时变长分配结构体数组,然后用执行结构体数组的指针实现操作。

这样能否在ANSI C中实现?

论坛徽章:
0
5 [报告]
发表于 2008-09-11 16:26 |只看该作者
原帖由 prc 于 2008-9-11 16:18 发表
typedef struct {
   int count;
  char array[0];
} vl_array_t;


这个比较好。

论坛徽章:
0
6 [报告]
发表于 2008-09-11 17:18 |只看该作者
typedef struct {
   int count;
  char str[1];
} data,*pdata;
pdata pd= (pdata)malloc(sizeof(data)+10);
pd->count=10;
strcpy(pd->str,"10chars");
pd->str[10]='\0';
pdata pd1= (pdata)malloc(sizeof(data)+100);
pd1->count=20;
strcpy(pd1->str,"100chars");
pd1->str[100]='\0';


不知道是不是这个意思

[ 本帖最后由 sunceenjoy 于 2008-9-11 17:19 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-09-11 17:34 |只看该作者
原帖由 prc 于 2008-9-11 16:18 发表
typedef struct {
   int count;
  char array[0];
} vl_array_t;

这个有不少人这样用的

论坛徽章:
0
8 [报告]
发表于 2008-09-11 17:45 |只看该作者
原帖由 sunceenjoy 于 2008-9-11 17:18 发表
typedef struct {
   int count;
  char str[1];
} data,*pdata;
pdata pd= (pdata)malloc(sizeof(data)+10);
pd->count=10;
strcpy(pd->str,"10chars");
pd->str[10]='\0';
pdata pd1= (pdata)malloc( ...


我的意思是这样的:
这是一个结构体和指向结构体的指针:
typedef struct {
  int count;
  char str[0];
}data,*pdata;

这是一个结构体数组和指向单个结构体数组的指针:

#define N 100
typedef struct {
  int count;
  char str[0];
}data[N],*pdata;


如果不知道N的值,或者N的值在程序中有变化,使用上面的方法就比较浪费空间了。

我想通过:
N=get_fun();/** get_fun 返回一个int 值**/

pdata tmp=(pdata)malloc(sizeof(data)*N);/** 分配了变长的结构体空间**/

/** 这个结构体理论上是这样的
int count
char str[0]~~~~~~~~~
**/

但是我想通过 tmp 这样的方式来访问
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP