为什么空类占用1字节,而空数组不占呢

eatsweetpotato 2009-11-14 10:56:20
RT
...全文
748 20 打赏 收藏 举报
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiejhzwrgcky 2009-11-16
Up
  • 打赏
  • 举报
回复
aizibion 2009-11-16
[Quote=引用 18 楼 myliupp 的回复:]
允许这样的写法,就是利用联合中的越界,来访问结构体后面分配的空间数据,但是这并不是种好的风格,因为它对结构体后的数据相连作了假定。
[/Quote]
这个警告是警告无意识造成这种情况得场景,对于有意制造得场景没什么特别含义,其实意识就是说
char c[0];这里有东西,至于是什么东西,你不用知道,只需要去按你"想象”得那样去用它,这里得想象实际也是程序指定得,比如模板,比如实现预设宏或是消息等等。

当然,这种用法本身不是有什么值得称道得地方,只不过是一种灵活性得体现,完全可以用另外得用法替代,这取决与编码人或设计人得习惯。

  • 打赏
  • 举报
回复
myliupp 2009-11-16
允许这样的写法,就是利用联合中的越界,来访问结构体后面分配的空间数据,但是这并不是种好的风格,因为它对结构体后的数据相连作了假定。
  • 打赏
  • 举报
回复
myliupp 2009-11-16
看看VC6下怎么说?
#include <iostream>
using namespace std;
struct A
{
int i;
char c[0];
};
int main()
{

return 0;
}
--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
Test.cpp
D:\VC\Test\Test.cpp(6) : warning C4200: nonstandard extension used : zero-sized array in struct/union

Test.obj - 0 error(s), 1 warning(s)
警告:非标准扩展的用法:结构/联合中的0尺寸数组。
  • 打赏
  • 举报
回复
macrojj 2009-11-15
int arr[0] 这样?
error了啊。
LZ 怎么分配空数组啊。
  • 打赏
  • 举报
回复
underuwing 2009-11-15
ls说的是真的嘛?
  • 打赏
  • 举报
回复
damo_xu 2009-11-15
编译器给一个空class插一个char,用以区分不同实体对象的地址。
  • 打赏
  • 举报
回复
yi_tian_zhao_hai 2009-11-15
[Quote=引用 9 楼 shiweifu 的回复:]
学习了
[/Quote]

对呀,空数组怎么定义?
  • 打赏
  • 举报
回复
weixiaoshashou 2009-11-15
[Quote=引用 6 楼 fanchangyong 的回复:]
怎么定义空数组?

int arr[0];
这样吗?
[/Quote]
我也疑惑,到底怎么定义空数组。
  • 打赏
  • 举报
回复
shiweifu 2009-11-15
学习了
  • 打赏
  • 举报
回复
中才德创 2009-11-15
空类,sizeof是四吗?
  • 打赏
  • 举报
回复
qygfr 2009-11-15
还是不太明白!
  • 打赏
  • 举报
回复
aizibion 2009-11-15
空数组在我们得系统中得用法

#include <iostream>

using namespace std;

#pragma pack(push ,1)
struct A
{
char a_a;
int a_b[0];
};

struct B
{
char b_a;
int b_b;
B():b_a(10),b_b(11){}
};

#pragma pack(pop)

int main()
{
int* p = new int[3];

A * p_a = (A*)new B;

cout<<sizeof(A)<<endl;

cout<<*p_a->a_b<<endl;

return 0;
}

  • 打赏
  • 举报
回复
fanchangyong 2009-11-14
怎么定义空数组?

int arr[0];
这样吗?
  • 打赏
  • 举报
回复
myliupp 2009-11-14
如果一个空类的长度为0,那么由5个空类组成的数组的长度也是0,这就会引起很多麻烦(像除0一样),如for遍历可能带来无限循环。所以一个对象至少也要占个空间(位段也要至少占1个字节,sizeof毕竟是以字节为单位的而不是位)。
数组呢,如果空数组的sizeof是1,那么1个元素的数组(char的话)的长度也是1,这一样会带来很多意外的麻烦。但是,空数组可以定义吗?这个我可不知道。
  • 打赏
  • 举报
回复
user0418 2009-11-14
学习了
  • 打赏
  • 举报
回复
eatsweetpotato 2009-11-14
空数组只是个符号,原来如此
  • 打赏
  • 举报
回复
aizibion 2009-11-14
空类可以实例化,实例化出来得对象的有地方放
空数组只是个符号。没有元素得数组,不需要地方放东西
  • 打赏
  • 举报
回复
mstlq 2009-11-14
空类占字节是为了区分同一类的不同对象
数组无此需求……
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2009-11-14 10:56
社区公告
暂无公告