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

eatsweetpotato 2009-11-14 10:56:20
RT
...全文
968 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
空类占字节是为了区分同一类的不同对象
数组无此需求……

64,760

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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