鱼C论坛

 找回密码
 立即注册
查看: 1537|回复: 2

[已解决]C语言字符数组的一个可能很傻的问题

[复制链接]
发表于 2019-8-16 17:45:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想问一个字符数组的问题:我看定义时总是指定数组长度,这样编译时就会为它分配空间。那我如果char a[]="";想问一下编译时a数组的地址是确定的吗?我后面再通过输入给a数组赋值,这样做有什么危害吗?
最佳答案
2019-8-16 18:06:53
本帖最后由 jackz007 于 2019-8-16 19:09 编辑

      虽然你定义了一个空的字符数组 a,但那只是逻辑上为空,事实上,这个数组至少留有一个字节的空间是用来保存字符串结束标志 '\0' 的。
      既然你定义了字符串,那么,在程序编译的时候,会相应预留足够的存储空间,而你定义的是空的字符数组,预留的空间必然会非常的小,具体能分到多少,主要取决于数据单元分配时的边界对齐方式,如果编译器是按 4 字节边界对齐,那就意味着虽然只需要 1 个字节空间,但实际上却可以分到 4 个字节。除了末尾的 '\0' 外,还有 3 个字节的余地可资利用。当然,向这个数组里面存数据也会面临下标超界的问题,如果你的赋值导致内存范围超出,自然就会危害到其他变量的内容,从而为程序带来不确定因素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-16 18:06:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-8-16 19:09 编辑

      虽然你定义了一个空的字符数组 a,但那只是逻辑上为空,事实上,这个数组至少留有一个字节的空间是用来保存字符串结束标志 '\0' 的。
      既然你定义了字符串,那么,在程序编译的时候,会相应预留足够的存储空间,而你定义的是空的字符数组,预留的空间必然会非常的小,具体能分到多少,主要取决于数据单元分配时的边界对齐方式,如果编译器是按 4 字节边界对齐,那就意味着虽然只需要 1 个字节空间,但实际上却可以分到 4 个字节。除了末尾的 '\0' 外,还有 3 个字节的余地可资利用。当然,向这个数组里面存数据也会面临下标超界的问题,如果你的赋值导致内存范围超出,自然就会危害到其他变量的内容,从而为程序带来不确定因素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-16 19:14:09 | 显示全部楼层
jackz007 发表于 2019-8-16 18:06
虽然你定义了一个空的字符数组 a,但那只是逻辑上为空,事实上,这个数组至少留有一个字节的空间是用 ...

您解释的很明白,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 18:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表