导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

kiko_lee 2001-08-16 04:27:23
第一次出现,在定义的时候出现的,谁知道啊。
...全文
348 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
不规则的用法不必去理会,旁门左道地东西。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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