scanf读取的字符数超过目标变量所能容纳的字符数
以下代码从scanf读取的字符数超过目标变量所能容纳的字符数,c,C,以下代码从stdin读取最多10个字符并输出字符。 当我输入超过10个字符时,我希望它崩溃,因为msg没有足够的空间,但它没有!怎么可能呢 #include <stdlib.h> #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char* msg = malloc(sizeof(char)*10); if (NULL==msg)
stdin
读取最多10个字符并输出字符。当我输入超过10个字符时,我希望它崩溃,因为
msg
没有足够的空间,但它没有!怎么可能呢
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char* msg = malloc(sizeof(char)*10);
if (NULL==msg)
exit(EXIT_FAILURE);
scanf("%s", msg);
printf("You said: %s\n", msg);
if (strlen(msg)<10)
free(msg);
return EXIT_SUCCESS;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*msg=malloc(sizeof(char)*10);
if(NULL==msg)
退出(退出失败);
scanf(“%s”,msg);
printf(“您说过:%s\n”,msg);
如果(strlen(msg)改用,scanf
不是缓冲区安全的。您看到的是。在使用scanf()时,您可以分配“安全”的大大小。在用户输入时,它应该是2行(cca.2x80字符),如果文件更大
结论:scanf()是一种快速而肮脏的东西,不要在严肃的项目中使用它。您可以在scanf()格式字符串中指定最大大小。
scanf("%9s", msg);
我可以想象malloc()
分配与字边界对齐的内存块。在32位机器上,这意味着无论您请求什么,都将被四舍五入到最接近的4倍。这意味着您可能会得到至少11个字符的字符串(加上'\0'
终止符),而不会遇到任何问题
但千万不要假设是这样。就像其他人所说的,如果你想避免问题,你应该在格式字符串中指定一个安全的最大长度。它不会崩溃,因为c非常宽松,这与流行的观点相反。如果缓冲区溢出,程序不需要崩溃,甚至不需要抱怨。比如you定义
union{
uint8_t a[3]
uint32_t b
}
那么[4]是完美的记忆,没有理由崩溃(但千万不要这样做)。即使是[5]或[100]也可能是完美的。
另一方面,我可能尝试访问[-1],这恰好是操作系统不允许您访问的内存,从而导致SEGFULT
至于如何解决这个问题:正如其他人指出的,scanf与缓冲区一起使用是不安全的。请使用他们的建议。当您有长度为10的字符数组时,尝试使用scanf(“%9s”,msg)
进行扫描。(保留1个字符作为字符串终止字符'\0'
)事实上,我输入了远远超过10个字符,我认为这超出了单词的界限,程序没有抱怨。它不会抱怨,只是会在某个时候崩溃。如果你在程序中定义了其他变量,你可能会发现它们的值做了奇怪的事情。你可能会发现这很有趣:问题是,为什么我们仍然可以ead的数据比我们分配的多!!