当前位置: 代码迷 >> C语言 >> 变长数组怎样操作?
  详细解决方案

变长数组怎样操作?

热度:254   发布时间:2006-10-15 08:56:51.0
变长数组怎样操作?

有些地方有如下声明:

char s[1];

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

搜索更多相关的解决方案: char  strlen  声明  可变  

----------------解决方案--------------------------------------------------------
学习下C++中的 vector 就知道怎么变长了

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

必须用动态完成!
----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
自己写一个链表,然后伪装成一个类,这样就能满足你的需求了。
不过性能....
----------------解决方案--------------------------------------------------------
以下是引用BlueDreame在2006-10-15 8:56:51的发言:

有些地方有如下声明:

char s[1];

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

c99支持,C89不支持
----------------解决方案--------------------------------------------------------

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

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


----------------解决方案--------------------------------------------------------
可以实现的.
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编辑过]


----------------解决方案--------------------------------------------------------

这个是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); //只要一次释放就可以

//...

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

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


----------------解决方案--------------------------------------------------------
另外,偶第一次回帖打了这么多字,如果觉得有用,有必要的话请斑竹加精
----------------解决方案--------------------------------------------------------
慢慢学习
----------------解决方案--------------------------------------------------------
  相关解决方案