请各位帮忙看看这个的原理

xingxing 2005-03-25 04:24:08
经常看代码,发现如下的代码
struct A
{
...
};
struct ATable
{
...
struct A handler[1];
};
然后可以通过ATable的handler[n]来访问A的列表元素,不知道是[1]为什么就可以实现列表?这是怎么分配内存的呢?
...全文
328 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Student02370236 2005-03-27
  • 打赏
  • 举报
回复
有些编译器不会通过这种用法,会出现段异常
mythlee 2005-03-27
  • 打赏
  • 举报
回复
这种代码并不那么危险,许多Windows,Linux的C程序都在使用这种方法,关键一点要知道自己在做什么。
zhousqy 2005-03-26
  • 打赏
  • 举报
回复
up
dongpy 2005-03-26
  • 打赏
  • 举报
回复
用mythlee(mythlee)的方法可以解决这个问题。

但是如果struct ATable在栈上分配内存的话,还是会出错,因为栈是向下生长的,而数组是向上生长

的。
dongpy 2005-03-26
  • 打赏
  • 举报
回复
数组访问越界了。

如果对handler[2]……handler[n]进行写入操作的话,会出错。
cssport2000 2005-03-26
  • 打赏
  • 举报
回复
建议不要用这么危险的代码啊
rocklabzhang 2005-03-26
  • 打赏
  • 举报
回复
up
HaiFen 2005-03-26
  • 打赏
  • 举报
回复
一般用在动态分配内存的场合,分配内存时,先分配足够存储N个handler的内存,就不会出现任何问题了!
zhousqy 2005-03-25
  • 打赏
  • 举报
回复
学习
mythlee 2005-03-25
  • 打赏
  • 举报
回复
它在创建 ATable 对象时使用的动态内存分配,假设需要 N 个 A的 ATable
则它应该用

atable=(struct ATable *)malloc(sizeof(struct ATable)+(N-1)*sizeof(struct A));

来创建该 ATable.
syliang2003 2005-03-25
  • 打赏
  • 举报
回复
数组越界了!~!
TangChin 2005-03-25
  • 打赏
  • 举报
回复
其实说白了就是指针引用而已,只是它用的空间不是显示的manlloc得到的
他的程序中肯定还有其他的一些刻意的内存安排。
lito_rat 2005-03-25
  • 打赏
  • 举报
回复
在linux下运行会出现段错误,数组越界
Flood1984 2005-03-25
  • 打赏
  • 举报
回复
但怎么保证struct A handler[0]后面的内存不被占用呢?
pcboyxhy 2005-03-25
  • 打赏
  • 举报
回复
很危险的代码
Michael_555 2005-03-25
  • 打赏
  • 举报
回复
struct A handler[1];利用C语言不做边界检查,handler[0]与越界的handler[2]……handler[n]将会存储在一个连续的空间内,相当于声明了struct A handler[n+1];

当然,这段代码的编写人已经明确知道handler[2]……handler[n]的空间不会被别的函数或变量使用。他这样做的目的,有可能使防止别人随意修改他的代码。

70,037

社区成员

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

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