有些地方有如下声明:
char s[1];
但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?
有些地方有如下声明:
char s[1];
但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?
有些地方有如下声明:
char s[1];
但是s是可变长的,即可能出现strlen( s ) > 1的情况。请问谁知道应该怎样做呢?
c99支持,C89不支持
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
这是微软对BITMAP相关的一个定义,至少VC 6中有,VC6不支持C99.
[此贴子已经被作者于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); //只要一次释放就可以
//...
这样也可以啊。只要申请一次,释放一次,空间实现了连续性!
变长数组是个非常灵活的东东,需要的技巧性也比较强些。