这个C程序的技巧是干什么的?解决思路
这个C程序的技巧是干什么的?C程序员的技巧之一: 把单一元素的数组放在一个struct的尾端,于是每个struct o
这个C程序的技巧是干什么的?
C程序员的技巧之一: "把单一元素的数组放在一个struct的尾端,于是每个struct objects"可以拥有可变大小的数组
C/C++ codestruct my{........char pc[1];};
我实在是没有看出来这个技巧有什么用,如何用?
各位解释一下?
[解决办法]用来存放不定长消息的。
前面定长的是消息头部,后面不定长的可以存消息体。
楼主可以看看TCP/UDP等相关代码。
[解决办法]利用了下面的几个知识:
1 c/c++当中指针的灵活性,指针相互之间是可以做转换的,没有类型条件限制,内存地址可以按照不同类型的数据来解释
2 struct 对象在内存当中的布局
malloc只负责分配一块指定大小的内存,并不做其他的事情,然后把内存的首地址返回
malloc关键词前面的(struct mumble *)强制类型转换,把这块内存转换为mumble类型数据了
实际上分配的内存要比一个mumble结构要大
memcpy这个函数是做内存当中数据的copy,它同样不检测数据的类型,即便是copy的数据超越了内存大小。
这个例子利用的也是这一点,把string当中的大量数据,copy到了mumble的pc变量所在的地址当中
因为malloc给这个地址分配了足够多的空间,copy超过1个char的数据到这里也不会产生实际的内存越界
后面对mumble.pc[n] n> 0 的访问,也是在malloc分配的空间当中,不会有异常
从c/c++的语法规范角度来说,上面的处理是不好的
但是作为其中的指针的灵活性的应用来说是可行的
c/c++当中的指针是所有语言当中最具有灵活性的,同时它也是最危险的
是可以利用指针做很多有趣的事情,但是必须要清楚一旦使用不当,造成的危害也是非常严重的
[解决办法]char data[0];就行了, data就是一个字节的地址, 变长结构体的数据开始地址.
[解决办法]其实就是把它作为一个指针来用的。
[解决办法]pc叫柔性数组成员。以前曾经认为这是技巧,但后来认识到,除了受c99标准支持的不完整类型形式的柔性数组成员外,其它无标准支持的柔性数组成员都属于未定义行为。因为对于越界时的地址计算,标准规定只有在数组内部从首元素到末元素后一个位置之间的指针运算才是有效的,其余情况下都属于未定义行为。一个实现,可以对越界行为产生地址回绕或者直接产生一个陷阱异常,这时就不会得到你所希望的结果了。