我看到例如 char a[0]; 什么意思呢。

kiko_lee 2001-08-16 04:27:23
第一次出现,在定义的时候出现的,谁知道啊。
...全文
724 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiko_lee 2001-08-17
  • 打赏
  • 举报
回复
好,有了不少的理解,多谢同志们的关心。
han012 2001-08-16
  • 打赏
  • 举报
回复
To kiko_lee:

我不知道在你所提到的环境中 char a[0] 和 char a[1]是否能起到相同效果。
如果相同,则azuo_lee所举的例子很好的说明了这种用法,即:把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。

既然azuo_lee说到了这种用法,而且是“这个用法遍地都是”。我想借此宝地向大家转述大师Stanley B.Lippman对此的看法。

C程序员的巧计有时候却成为C++程序员的陷阱
例如把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组:
struct mumble{
char pc[1];
}

//从标准输入装置中取得一个字符串
//然后为struct本身和该字符串分配足够的内存
struct mumble *pmumbl =(struct mumble*)
malloc(sizeof(struct mumble)+strlen(string)+1);

strcpy(&memble.pc,string);

如果我们改用class来声明,而该class是:
#指定多个access sections,内含数据;
#从另一个class派生而来;
#定义有一个或多个virtual functions;

那么以上用法或许可以顺利转化,但或许不行!

C++中凡处于同一个access section的数据,必定保证以其声明的次序出现在内存布局中。然而被放置在多个access sections中的各笔数据,排列次序就不一定了。下面的声名中,前述的C伎俩或许可以有效运行,或许不能,需视protected data members被放在private data members的前面或后面(放在前面才可以):
class strumble{
public:
// operations ...
protected:
// protected stuff
private:
// privated stuff
char pc[1];
};

... ...所以最好的忠告就是:不要那么做。

以上内容摘自《深度探索C++对象模型》,仅供参考。
azuo_lee 2001-08-16
  • 打赏
  • 举报
回复
这个用法遍地都是,有什么奇怪?
它就是利用了c语言的一个特性:不对数组边界做检查。
就比如DIB位图的头里面需要定义一个颜色表,但是你定义头结构的时候并不知道这个颜色表会有多大。如果这样定义:
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
那么,编译器就会将bmiColors理解为属于BITMAPINFO的一个指向RGBQUAD的指针,以后当真正有数据读到内存后,你将内存的首地址转化为一个BITMAPINFO类型的指针,就可以直接存取bmiColors[25]这样的元素了,编译器是不会检查的。
zhaoyao73 2001-08-16
  • 打赏
  • 举报
回复
char a[0];应该是声明一个常量指针吧
missy 2001-08-16
  • 打赏
  • 举报
回复
好象这样也有利于char与CString型的转换
stoneyrh 2001-08-16
  • 打赏
  • 举报
回复
好象位图里的颜色表也有类似的用法
kiko_lee 2001-08-16
  • 打赏
  • 举报
回复
想想办法哦,看不懂这个到底是做啥用的。多麻烦呢
Great_Bug 2001-08-16
  • 打赏
  • 举报
回复
看看
yangmajituipo 2001-08-16
  • 打赏
  • 举报
回复
在结构体中可再动态分配空间
kiko_lee 2001-08-16
  • 打赏
  • 举报
回复
一个linux中间的struct 的定义中间的一部分,反正是用C写的,所以到这里问应该也不错。
老南 2001-08-16
  • 打赏
  • 举报
回复
在什么环境下见到的?
kiko_lee 2001-08-16
  • 打赏
  • 举报
回复
还有就是见到了 struct aaa aaa1[0];
这样的格式同样发生在一个定义的结构最后面,是如何的意思呢,难道还是和上面的一样的,
同志们啊,还有什么理解没有呢。
ssh_zy 2001-08-16
  • 打赏
  • 举报
回复
其实就是告诉机器:你不要帮我乱加‘\0’,你也不要管我是不是会数组越界,反正我就是这么写了
111222 2001-08-16
  • 打赏
  • 举报
回复
不规则的用法不必去理会,旁门左道地东西。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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