标题:变长数组怎样操作?
只看楼主
BlueDreame
Rank: 1
等 级:新手上路
帖 子:545
专家分:2
注 册:2004-12-16
结帖率:66.67%
 问题点数:0 回复次数:32 
变长数组怎样操作?

有些地方有如下声明:

char s[1];

但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?

搜索更多相关主题的帖子: char strlen 声明 可变 
2006-10-15 08:56
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
得分:0 
学习下C++中的 vector 就知道怎么变长了

用 静态的数组肯定不行...

必须用动态完成!

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-10-15 09:09
BlueDreame
Rank: 1
等 级:新手上路
帖 子:545
专家分:2
注 册:2004-12-16
得分:0 

如果你看BITMAP的相关声明就会发现有这种现象。


2006-10-15 09:18
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
自己写一个链表,然后伪装成一个类,这样就能满足你的需求了。
不过性能....

淘宝杜琨
2006-10-15 09:20
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
以下是引用BlueDreame在2006-10-15 8:56:51的发言:

有些地方有如下声明:

char s[1];

但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?

c99支持,C89不支持


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-10-15 09:48
BlueDreame
Rank: 1
等 级:新手上路
帖 子:545
专家分:2
注 册:2004-12-16
得分:0 

typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

这是微软对BITMAP相关的一个定义,至少VC 6中有,VC6不支持C99.


2006-10-15 10:20
jiangzw625
Rank: 1
等 级:新手上路
帖 子:119
专家分:0
注 册:2006-3-27
得分:0 
可以实现的.
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

你可以这样.
BITMAPINFO * pBit=(BITMAPINFO*)malloc(sizeof(BITMAPINFO)+(你想再增加的长度,比如)sizeof(RGBQUAD*1000));
这样你就可以得到一个动态的数组
原理也很简单.就是利用了指针.
动态开辟的内存单元,任何数据类型都可以用,只要长度符合

[此贴子已经被作者于2006-10-15 12:06:23编辑过]


马马乎乎
2006-10-15 12:05
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 

这个是C的问题,跟面向对象根本没有任何关系,不要牵扯到面向对象!

typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

RGBQUAD bmiColors[1]; //这是保留位置的用法,也没啥特殊,就占1个位置,然后整个结构的内容作为一个整体传送,

这就不需要去管bmiColors的占用地址了。

使用变长数组可以减少内存的碎片,可以节省的应该还不止一个指针的空间,有时候是可以节省很多空间的。因为不同的

操作系统对动态内存分配的支持可能不相同,一般申请的字节数和系统开销的字节数不会相等,比如你只要求几个字节,

系统可能还是要给你512字节。在这种情况下,节省的还是挺多的。

因为一般情况下如果采用指针的形式(这里是指一般情况下),那么空间就不是连续的,而数组在空间上却是连续的。

不过也可以用指针实现空间的连续性,只是这里涉及到一些技巧。

举个例子吧:

//here is an example ...

struct _t {
size_t size;
char *s; //这里换成是指针,而不是象楼主的例子一样是char s[1];
};

char str[] = "12345678910",;

t = (struct _t *)malloc(sizeof (struct _t) + strlen(str) + 1);

t->size = 10;

t->s = (char *)t + sizeof(struct _t);

strncpy(t->s, "12345678910", t->size - 1);

free(t); //只要一次释放就可以

//...

这样也可以啊。只要申请一次,释放一次,空间实现了连续性!

变长数组是个非常灵活的东东,需要的技巧性也比较强些。


我的原则很简单:不做不喜欢的事!
2006-10-15 12:08
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 
另外,偶第一次回帖打了这么多字,如果觉得有用,有必要的话请斑竹加精

我的原则很简单:不做不喜欢的事!
2006-10-15 12:09
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
得分:0 
慢慢学习

谁有强殖装甲第二部,可以Q我460054868
2006-10-15 13:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-96417-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.378282 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved