我正在学习 C 语言,很快遇到了本教程中的第一个问题。代码如下:
#include <stdio.h>
#include <stdbool.h>
static char buffer[10];
int main(int argc, char **argv) {
puts("Lispy VERSION 0.0.0.0.1");
puts("Press Ctrl+c to exit\n");
while (true) {
fputs("Lispy> ", stdout);
fgets(buffer, 2048, stdin);
printf("No you are a %s", buffer);
}
return 0;
}
在这段代码中,我想实验一下如果函数max_count
的第二个参数fgets
超过了 的大小会发生什么buffer
。令我惊讶的是,程序运行完美,没有任何错误,编译器也没有给我任何关于潜在问题的警告。
我使用了编辑器中的调试功能,发现如果我输入一个像这样的字符串HELLLOOOOOOOOOOOOOOOOOOOOOOO
,内存情况如下所示:
如上图所示,看起来整个输入字符串都正确地存储在内存中了!而且, 的大小似乎与buffer
我指定的(10 字节)不完全一致。如果是 10 字节,该行printf("No you are a %s", buffer);
应该只打印 10 字节,但它却打印了整个字符串“HELLLOOOOOOOOOOOOOOOOOOOOOOOOO”。
这是否意味着我实际上访问了超出分配大小的内存buffer
?