所以我正在学习使用编译器Dev c++编程c。问题1:
#include <stdio.h>
#include <conio.h> //for the getch() function
#include <string.h>
int main(void)
{
char line[3];
strcpy(line, "Hello world");
printf("%s", line);
getch();
}
输出:Hello world
为什么当我声明我的字符串只容纳3个字符时,它会显示所有的"Hello world"?
问题2:
char line[3] = "Hello world";
printf("%s", line);
输出:冥界
为什么显示"Hel"?它不应该只显示"He",因为行[0]= H,行[1]= e,行[2]= ' '?而%s是通过搜索' '来工作的吗?
请帮助我了解到底发生了什么。谢谢!
请帮助我了解到底发生了什么。
未定义的行为!
当你这样做的时候,你有一个缓冲区溢出:
char line[3];
strcpy(line, "Hello world");
为什么当我声明我的字符串只容纳3个字符时,它会显示所有的"Hello world"?
复制的数组大于已分配数组的大小。这是未定义的行为,因此任何输出都是可能的,包括但不限于,打电话给Tilda阿姨,格式化硬盘等:)更多信息请参阅这里。
char line[3] = "Hello world";
printf("%s", line);
这里缓冲区读过了!参考alk的回答,为什么只有3个字符会被复制到line
。
为什么显示"Hel"?难道它不应该只显示"He"
不,它可以显示任何东西,还是因为未定义的行为。看看我在我的机器上得到了什么输出:
冥界☻
这是未定义的行为,因为printf
期望你有一个以null结尾的字符串,是的,但这并不意味着你可以访问超出数组大小的数组,也就是说,你在内存中有一个像这样的数组
[0] [1] [2] ----------------------------------------------- . . . █ | █ | █ | H | e | l | █ | █ | █ | . . . ----------------------------------------------- <-- line --->
上面写为█的任何东西都是一个未知的值,不在你的能力范围内,因此访问它们是未定义的。然而,printf
中的%s
期望一个以空结尾的字符串,因此,在您的命令下,它的读取超出了允许的范围(允许的只是三个元素,直到l
)。在我的情况下,