报错:error C2229: class ' ' has an illegal zero-sized array 引发的思考

  • 问题:

上面是结构体中的成员,值得注意的是结构体的最后一个成员数组就不会显示错误。Why?

我们写一个程序测试一下:

当指定了数组大小为1的时候,发现b和c的地址是连续的:

给b数组开辟了一个int大小的空间。

所以如果不给素组限定大小,那么b和&c的地址就会指向同一处。就会提示错误:

但如果b是结构体最后一个元素就无所谓了:

输出:

 

  • 思考一:

为什么这样是无法赋值的?

报错:

 

报错:

原因在于,定义结构体的时候,b是一个地址常量,它不能再被赋值。首先,注意不要把数组和指针混淆。指针是一个变量,可以被赋值,而这里的数组b中的"b"是一个地址常量。其次,从实现的角度考虑,数组就是开辟了一段内存空间,用这段空间存放数据,这其中的数据可以更改,但你不能随意挪动数组的位置(即不能随便改变b的值)

 

  • 思考二:

如果不指定b数组的大小,强行给它赋值会有什么问题?

这段赋值本是没有什么问题的,但是VS在你运行结束之后仍然会提示你:

这里你只给b添加了两个值,可能还没什么影响,但是如果是这样:

就会报Access Violation的错误:

 

  • 思考三:

对于这段能够正常运行的代码,会输出什么?

我们跟踪进main:

 

 

先是开辟了一段堆栈空间,填充的内容都是CCCCC...:

将三个数据存放入结构体中:

struct中的这三个成员在栈中是连续排列的。

运行结束:

这里,为什么会输出一堆乱码?

原因在于你给b数组开辟了10个char大小的空间,但是只给其中一个赋值,它里边有一部分被CCCCC填充,而"CCCC"对应的就是“烫烫”...

 

总之,结构体中的成员,要给出明确的大小,让机器知道给你预留多少空间。

 

posted @ 2015-09-18 18:05  _No.47  阅读(1828)  评论(0编辑  收藏  举报