c - 变量保存字符串“He”,但打印“Hello World”
问题描述
#include<stdio.h>
#include<string.h>
main()
{
char c[2];
strcpy(c,"Hello World");
printf("%s",c);
}
在上面的代码中,我初始化了一个只能容纳两个字符的字符数组。那么,上面代码的输出一定是“He”。但是,我发现输出是“Hello World”。这怎么可能?
调试这个程序我发现直到执行 printf 语句,c 的值确实(如预期的那样)“He”。但是在执行 printf 之后,完整的文本“Hello World”会打印在输出屏幕上!
有趣的部分是 c 包含字符串“He”,但是当我们打印出 c 时,它会打印出“Hello World”!
谁能解释一下这是怎么回事?
解决方案
以下语句通过尝试写入正在运行的程序不拥有的内存来调用未定义行为(UB)。
char c[2];
strcpy(c,"Hello World");
第一条语句创建了两个char
内存位置,但字符串文字"Hello World"
至少需要 12 个(包括空间\0
)。执行后strcpy(...)
任何事情都可能发生,甚至看起来可以工作,但如前所述,它正在调用 UB。
为数组的预期用途声明足够的空间char
是必不可少的,并且可以通过多种方式完成,例如,以下任一方式都可以:
char c[] = {"Hello World"};//let compiler do the work of determining size needed
printf("%s", c);
或者:
char c[12] = {0};//provide minimum of length of string + 1 for null termination.
strcpy(c,"Hello World");
printf("%s", c);
但是,如果c
打算在您的程序中稍后用于包含更大的字符串,则相应地调整其大小。
推荐阅读
- ios - 使用 Swift 4 关闭 iOS 中的所有模式
- python - 关于多个输出的 Keras 回归问题中的损失加权
- twitter-bootstrap - 引导输入字段方角错误
- c++ - 通过 clang-format 对几乎精确的结构进行不同的格式化
- javascript - 可以使用 python 在线下载 javascript 生成的 CSV 文件吗?
- javascript - React 数组为什么会这样?
- azure - 来自 Visual Studio 项目的带有 python 的 Azure 应用服务
- python - 我如何通过 python 使用用户名、密码来制作 SSl 连接服务器?
- c++ - c++ string.find() 返回字符串的长度
- javascript - 使用 Three.js 创建带有点的桩的 3D 模型