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

时间:2021-12-26 19:59:10
  • 问题:

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

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

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

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

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

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

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

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

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

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

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

输出:

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

  • 思考一:

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

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

报错:

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

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

报错:

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

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

  • 思考二:

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

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

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

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

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

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

就会报Access Violation的错误:

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

  • 思考三:

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

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

我们跟踪进main:

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

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

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

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

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

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

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

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

运行结束:

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

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

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

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

报错:error C2229: class ' ' has an illegal zero-sized array 引发的思考的更多相关文章

  1. linux使用wkhtmltopdf报错error while loading shared libraries:

    官网提示 linux需要这些动态库.depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) 在li ...

  2. 发布报错: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,报了这个错,纳尼! ...

  3. 升级到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' ...

  4. inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice'

    inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice' 在公司的电脑上出现过这个错误,后来 ...

  5. 运行编译后的程序报错 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 ...

  6. CentOS命令登录MySQL时,报错ERROR 1045 (28000):

    CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...

  7. 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: 问题原因: ...

  8. 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 ...

  9. 运行yum报错Error: Cannot retrieve metalink for reposit

    http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for reposit 今天给Centos通过rpm - ...

  10. 转:运行yum报错Error: Cannot retrieve metalink for reposit

    http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please ...

随机推荐

  1. Delphi_06_Delphi_Object_Pascal_基本语法_04

    这一节描述基本语法中的流程语句: 条件语句 IF语句. 选择语句 Case语句.循环语句  while/repeat/for.以及continue.break语句,还有终止程序 运行流程Exit.Ha ...

  2. 临界区 TRTLCriticalSection 和 TCriticalSection

    临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别 TRtlCriticalSection 是一个结构体,在windows单元中定义: 是I ...

  3. Maven测试

    生命周期阶段需要绑定到某个插件的目标才能完成真正的工作,test阶段正是与maven-surefire-plugin的test目标相绑定了,这是一个 内置的绑定. 在默认情况下,maven-suref ...

  4. Mac OS X用户,使用homebrew安装,FreeBSD也可以

    qtkeychain 这是编译和运行软件必须的库.各平台都可以编译安装.对于Mac OS X用户,使用homebrew安装: brew install qt5keychain (旧版本的Mac OS ...

  5. zabbix主动上报的python脚本

    本代码linux.window平台通用. 不过我遇到一个Windows2008缺少运行库的提示,可能这个是Python3.6开发的.需要安装vc2015运行库吧.我没调试成功. linux平台还可以监 ...

  6. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  7. 一起学Android之ViewPager

    本文以一个简单的小例子,简述在Android开发中ViewPager的常见用法,仅供学习分享使用. 概述 ViewPager是一个支持使用者左右滑动的布局管理控件,可以通过一个实现的(适配器)Page ...

  8. 基于ip的虚拟主机配置——在一台服务器上绑定多个 IP 地址

    进入/etc/sysconfig/network-scripts,修改ifcfg-ens33文件 输入 ip addr 查看ip 引用:https://blog.csdn.net/u013887008 ...

  9. vue UI框架

    一.pc端 element UI 饿了么UI支持vue2.x80分优点:组件的API方法.属性等封装的较为完善缺点:样式有些生硬,不够炫酷美观 N3 N3支持vue2.x70分优点:组件操作几乎都有动 ...

  10. eclipse创建的maven项目中使用javafx

    类似普通maven项目,不需要特地创建javafx项目. 将fxml资源文件放在resource目录下即可.