把单一元素的数组放在一个struct的尾端,则每个struct objects就拥有了可变大小的数组

标题是《深度探索C++对象模型》(《Inside The C++ Object Model》)中的一句话,其中给出的例子如下:

strcut mumble{
    char pc[1];
};

strcut mumble * pmumbl = (struct mumble *)
                malloc(sizeof(struct mumble) + strlen(string) + 1);

strcpy(pmumbl->pc, string);

这里利用了下面的几个知识(从一位评论者copy来的,觉得讲得很好):
  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++当中的指针是所有语言当中最具有灵活性的,同时它也是最危险的
是可以利用指针做很多有趣的事情,但是必须要清楚一旦使用不当,造成的危害也是非常严重的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值