C语言中指定字符串存储数组长度的作用是什么?
现象本质说明
你观察到的“输入超出数组声明长度的字符串仍能正常输出”属于C语言中的未定义行为(Undefined Behavior, UB),只是当前运行环境下的偶然表现,完全不代表代码逻辑合法、安全。
你给出的示例代码本身存在两处不规范写法:
- 存储字符串应使用
char类型数组,而非int类型数组:32/64位系统中int通常占4字节,因此你声明的int c[4]实际分配了16字节的连续内存空间,刚好可以容纳ABCDE加末尾的\0字符串结束符,因此暂时没有触发明显异常。 - 使用
scanf("%s", 地址)读取字符串时没有限制写入长度,本身就是高危写法,极易触发缓冲区溢出问题。
声明数组长度的核心意义
- 编译器/操作系统会按照你声明的数组长度,为你分配对应大小的合法可访问连续内存空间,超出这个长度的内存区域你没有合法的访问权限。
- 数组长度是你控制内存访问边界的核心依据:如果写入内容超出了数组的合法长度,就会覆盖其他内存区域的数据,轻则篡改程序其他变量的值、输出乱码,重则触发段错误直接终止程序,甚至被利用执行恶意代码。
- 正确的字符串读取写法需要匹配数组长度做限制,例如你声明
char c[5];(最多存4个可见字符加1个结束符),对应的安全输入写法为scanf("%4s", c);,避免越界写入。
内容的提问来源于stack exchange,提问作者Yogesh Singh Rawat
相关产品推荐
相关产品推荐

