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

zjpixyniannian 2006-02-08 12:01:12
如:
strcut mumble{
char pc[1];
};

.....

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

strcpy(pmumbl->pc, string);

?????
...全文
472 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
FigoZhu 2006-02-08
  • 打赏
  • 举报
回复
楼上说得太好了。
主要是利用C的指针很灵活,另外malloc一个比该结构大的SIZE的内存,这个数组就是后面动态部分的首地址。
寻开心 2006-02-08
  • 打赏
  • 举报
回复
利用了下面的几个知识:
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++当中的指针是所有语言当中最具有灵活性的,同时它也是最危险的
是可以利用指针做很多有趣的事情,但是必须要清楚一旦使用不当,造成的危害也是非常严重的

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧