首页 > 解决方案 > 变量保存字符串“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”!

谁能解释一下这是怎么回事?

标签: cstringprintf

解决方案


以下语句通过尝试写入正在运行的程序不拥有的内存来调用未定义行为(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打算在您的程序中稍后用于包含更大的字符串,则相应地调整其大小。


推荐阅读