有些地方有如下声明:
char s[1];
但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?
----------------解决方案--------------------------------------------------------
学习下C++中的 vector 就知道怎么变长了
用 静态的数组肯定不行...
必须用动态完成!
----------------解决方案--------------------------------------------------------
如果你看BITMAP的相关声明就会发现有这种现象。
----------------解决方案--------------------------------------------------------
自己写一个链表,然后伪装成一个类,这样就能满足你的需求了。
不过性能....
----------------解决方案--------------------------------------------------------
有些地方有如下声明:
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); //只要一次释放就可以
//...
这样也可以啊。只要申请一次,释放一次,空间实现了连续性!
变长数组是个非常灵活的东东,需要的技巧性也比较强些。
----------------解决方案--------------------------------------------------------
另外,偶第一次回帖打了这么多字,如果觉得有用,有必要的话请斑竹加精
----------------解决方案--------------------------------------------------------
慢慢学习
----------------解决方案--------------------------------------------------------