|
|
1
7
要具体回答您的问题,您必须记住,发生的事情在很大程度上是特定于实现的。您看到的特定行为并不一定适用于所有C实现。这就是C标准所称的“未定义行为”。考虑到这一点:
您已为两个分配了存储空间
然后,在第二个
换句话说,第二个输入只会覆盖第一个输入,因为它超出了分配给它的存储空间的界限。然后,当你打印出来
这是因为两个相互作用的效应。首先,你在哪里打印
因此,它会在程序退出时打印它,但您的程序永远不会退出。由于您覆盖了堆栈中未管理的部分,因此在本例中,您覆盖了
对于您的程序
自从
是的,确实如此。这只是你抹掉了它后面的记忆。
一般来说,
|
|
|
2
2
您必须在C中进行边界检查,以确保缓冲区不会溢出。因此,您的输出是未定义的。如果您多次运行该代码,它一定会在某个时刻崩溃,因为溢出的缓冲区最终会覆盖一些重要的内容。 |
|
3
2
这称为缓冲区溢出。您分配了一个字符来保存输入,但您正在编写超出这个字符的内容(弄乱了程序的其余内存)。 与Java不同,C编译器和运行时不强制执行数组边界。这是“(内存)管理语言”和低级语言之间的主要区别之一。 |
|
|
4
2
您的数组只支持 一 字符,其余部分超出边界。 超出数组范围的访问是 未定义 通常是灾难性的。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |