关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
这一章在第19页,写的好深奥,我竟然没看明白在说什么~~之后再看了几遍,终于明白了。
原文:
C程序员的巧计有时候却成为c++程序员的陷阱。例如把单一元素的数组放在一个struct的末尾,于是每个struct objects可以拥有可变数组的数组: struct mumble { /* stuff */ char pc[1]; }; //从文件或标准输入装置中取得一个字符串 //然后为struct 本身和该字符配置足够的内存 struct mumble * pmumbl = (struct mumble*) malloc(sizeof(struct mumble) + strlen(string) +1); strcpy(&mumble.pc,string);
如此深奥,他到底想要表达什么?
首先,结构体的末尾定义了一个char数组,只分配了1个字符。那怎么能说是可变大小数组。
往下看,他用malloc函数分配了一堆的内存。大小为结构体+字符串+1(字符串结束符)如下图所示。
通过strcpy,将string字符串拷贝给mumble.pc,pmumble已经分配了足够的内存,因此只要赋值即可,也就达到了可变大小数组的意思。
但是,C++中的类可不同。
class stumble{ public: //operations ... protected: //protected stuff private: /* private stuff */ char pc[1]; };
C++中 public、protected、private内的声明顺序可以被保证,但是这三个关键字的布局是不同的。因此总的排列顺序并不能被保证。因此,不能实现struct的可变大小的数组。