还有就是见到了 struct aaa aaa1[0];
这样的格式同样发生在一个定义的结构最后面,是如何的意思呢,难道还是和上面的一样的,
同志们啊,还有什么理解没有呢。
这样的格式同样发生在一个定义的结构最后面,是如何的意思呢,难道还是和上面的一样的,
同志们啊,还有什么理解没有呢。
解决方案 »
- VS2005中如何查阅MSDN?
- 做完控件随父窗体变化的程序,不起作用,附程序
- 如何合并多个dll?
- 在oledb 客户端应用程序中,为什么创建session对象不成功
- 分数就不是什么问题,我的问题是求一直线与三角形的交点
- 怎么让打开的对话框不在任务栏上显示其标题?
- 使用h.263进行视频压缩时出错?
- 这种情况下如何使用microsoft ado data control
- [转帖]一个美国老工程师的心理话
- much point!!!谁能告诉我html的标准文档在那里可以下载,最好有状态转换图
- 大虾请进:如何使用函数NetMessageBufferSend?
- 如何编程得知“系统中所有的正运行的挂钩程序”???
它就是利用了c语言的一个特性:不对数组边界做检查。
就比如DIB位图的头里面需要定义一个颜色表,但是你定义头结构的时候并不知道这个颜色表会有多大。如果这样定义:
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
那么,编译器就会将bmiColors理解为属于BITMAPINFO的一个指向RGBQUAD的指针,以后当真正有数据读到内存后,你将内存的首地址转化为一个BITMAPINFO类型的指针,就可以直接存取bmiColors[25]这样的元素了,编译器是不会检查的。
如果相同,则azuo_lee所举的例子很好的说明了这种用法,即:把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。既然azuo_lee说到了这种用法,而且是“这个用法遍地都是”。我想借此宝地向大家转述大师Stanley B.Lippman对此的看法。C程序员的巧计有时候却成为C++程序员的陷阱
例如把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组:
struct mumble{
char pc[1];
} //从标准输入装置中取得一个字符串
//然后为struct本身和该字符串分配足够的内存
struct mumble *pmumbl =(struct mumble*)
malloc(sizeof(struct mumble)+strlen(string)+1); strcpy(&memble.pc,string);如果我们改用class来声明,而该class是:
#指定多个access sections,内含数据;
#从另一个class派生而来;
#定义有一个或多个virtual functions;那么以上用法或许可以顺利转化,但或许不行!C++中凡处于同一个access section的数据,必定保证以其声明的次序出现在内存布局中。然而被放置在多个access sections中的各笔数据,排列次序就不一定了。下面的声名中,前述的C伎俩或许可以有效运行,或许不能,需视protected data members被放在private data members的前面或后面(放在前面才可以):
class strumble{
public:
// operations ...
protected:
// protected stuff
private:
// privated stuff
char pc[1];
};... ...所以最好的忠告就是:不要那么做。以上内容摘自《深度探索C++对象模型》,仅供参考。