报错: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"对应的就是“烫烫”...
总之,结构体中的成员,要给出明确的大小,让机器知道给你预留多少空间。
报错:error C2229: class ' ' has an illegal zero-sized array 引发的思考的更多相关文章
- linux使用wkhtmltopdf报错error while loading shared libraries:
官网提示 linux需要这些动态库.depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) 在li ...
- 发布报错:Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store
发布报错:Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store 昨晚上传项目到AppStore,报了这个错,纳尼! ...
- 升级到macOS 10.12 mysqlb报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
系统升级到macOS 10.12后启动mysql后,在终端输入mysql 报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' ...
- inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice'
inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice' 在公司的电脑上出现过这个错误,后来 ...
- 运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory
运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such f ...
- CentOS命令登录MySQL时,报错ERROR 1045 (28000):
CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...
- android sdk启动报错error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:
android sdk启动报错error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 问题原因: ...
- mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法
1. 问题背景 InnoDB是新版MySQL(v5.5及以后)默认的存储引擎,之前版本的默认引擎为MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,关于InnoD ...
- 运行yum报错Error: Cannot retrieve metalink for reposit
http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for reposit 今天给Centos通过rpm - ...
- 转:运行yum报错Error: Cannot retrieve metalink for reposit
http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please ...
随机推荐
- js数据转换
javascript有如下数据类型的转换方法:一,转换成数字 xxx*1.0 转换成字符串 xxx+"" 二,从一个值中提取另一种类型的值,并完成转换工作. 1.提取字符串中的整数 ...
- 3.编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。
package zuoye; import java.io.FileInputStream; import java.io.FileOutputStream; public class BinIoDe ...
- IAR和Keil文件包含路径设置
在模块化编程时,为一个模块单独设置头文件是必不可少的. 在两款主流编译器中,在引用模块函数时候,包含头文件路径是必须的,那么设置文件路径的准确性就显得尤为重要. 否则,编译器会报错,无法打开某某头文件 ...
- 【java学习】Servlet简单的表单程序(一)
此文用于java学习,在此小记. 在此小Demo中使用到了Servlet,所以有必要了解一下Servlet的相关知识.(Servlet的相关知识摘抄自http://blog.csdn.net/jiuq ...
- MediaWiki搭建教程
♦ MediaWiki是什么以及有什么作用,这里我就不再阐述了,网上可以查到很多.这里只是简单记录一下搭建wiki的基本过程,给一些热爱捯饬的小伙伴一些参考. ♦ 其实wiki的搭建本身很简单,最 ...
- elasticsearch 批量插入
将下面数据写入requests { "create": { "_index": "index1", "_type": & ...
- java编写简单的累加程序
编程思路:1.建立类包demo: 2.在类包中建立CommanParameter类: 3.利用for循环通过强制类型转换将在后台中输入的String类型的字符转换为整型并进进累加操作: package ...
- HADOOP与ORACLE关联
安装Oracle和Oracle大数据连接器/OLH,尝试把HDFS中的数据文件装载到Oracle中的表 http://f.dataguru.cn/thread-460110-1-1.html 文档讲述 ...
- 自定义NSOperation
一直在思考,每次异步请求都会创建一个新线程,如果我同时发100个异步请求,这样会导致我的内存爆满,应用程序奔溃,因为iOS对开线程有着约束,不能开很多个线程,这就要求我们必须对异步请求进行控制,我一直 ...
- STM32F207V 进行DS18B20处理
1. DS18B20接口很简单,VCC.DQ.GND三个引脚,VCC采用外部供电3.3V,DQ需上拉电阻,当时按照参考资料上外接4.7K的上拉电阻,GPIO设置的OD无上拉,始终读不到ROM中的64 ...