报错: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"对应的就是“烫烫”...

 

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

 

转载于:https://www.cnblogs.com/predator-wang/p/4820027.html

<think>嗯,用户遇到了CodeBlocks中的中文字符编码问题,编译时出现“errorconvertingtoexecutioncharacterset:Illegalbytesequence”。我需要根据提供的引用信息来找出解决办法。首先,引用[1]和[2]提到,GCC默认使用UTF-8,而Windows使用GBK,所以需要在编译器设置中添加-fexec-charset=GBK和-finput-charset=UTF-8。但用户可能已经这样做了,问题依旧,可能文件编码还是ANSI,需要用记事本另存为UTF-8。引用[3]指出CodeBlocks默认保存为ANSI,需要设置编辑器保存为UTF-8。所以步骤应该是:1.设置编译器选项,添加那两个参数;2.修改编辑器默认编码为UTF-8;3.检查文件实际编码,用记事本转换。另外,用户可能漏掉了某个步骤,比如文件本身还是ANSI,或者编辑器设置没保存正确。需要分步骤详细说明,确保用户不会遗漏。</think>### CodeBlocks中文字符编码问题解决方案 针对CodeBlocks编译时出现`error: converting to execution character set: Illegal byte sequence`的问题,以下是分步解决方案: --- #### **步骤1:设置编译器字符集参数** 1. 打开CodeBlocks,进入`Settings` → `Compiler` → `Global compiler settings` → `Other options` 2. 在输入框中添加以下参数: ```text -fexec-charset=GBK -finput-charset=UTF-8 ``` - `-finput-charset=UTF-8`:指定编译器以UTF-8编码解析源代码文件[^2]。 - `-fexec-charset=GBK`:生成的执行文件使用GBK编码显示中文字符(兼容Windows中文环境)[^1]。 --- #### **步骤2:修改编辑器默认文件编码** 1. 进入`Settings` → `Editor` → `General settings` → `Other settings` 2. 将`Encoding`设置为`UTF-8`,并勾选`Always use this encoding`。 - 此操作确保新建文件或保存现有文件时默认使用UTF-8编码[^3]。 --- #### **步骤3:检查并转换现有文件编码** 1. **验证文件编码**: - 用记事本打开代码文件 → 点击`另存为` → 查看当前编码(如显示`ANSI`或`GBK`,则需转换)。 2. **强制转换为UTF-8**: - 在记事本`另存为`对话框中,选择编码为`UTF-8`,保存后覆盖原文件。 --- #### **步骤4:验证解决方案** 1. 重新编译代码,检查是否仍报错。 2. 若仍存在乱码,检查以下细节: - 代码中是否包含特殊字符(如全角符号)。 - 确保所有相关文件(如头文件)均使用UTF-8编码。 --- #### **原理说明** - **问题根源**:Windows系统默认使用GBK编码,而GCC编译器默认按UTF-8解析代码文件。若文件实际编码为ANSI/GBK,编译器会因字符映射错误而报错[^2][^3]。 - **解决方案逻辑**:通过编译器参数和文件编码统一,确保编码解析与执行环境一致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值