C语言scanf输入疑问:循环未执行完提前终止原因解析
问题原因分析
这段代码的核心问题是缓冲区溢出导致的内存越界修改,具体拆解如下:
scanf("%s")的行为特性scanf("%s")会读取输入中直到空白字符(空格、换行、制表符)的所有字符,并且会自动在读取到的字符串末尾添加一个'\0'(字符串结束符)来标记字符串结束。数组空间不足引发溢出
代码里定义的char s[1]仅分配了1个字节的内存空间。当输入单个字符时,scanf需要存储该字符加上'\0',总共需要2个字节的空间——这直接超出了s的容量,触发缓冲区溢出。溢出破坏循环变量
t
程序的局部变量t和s通常会被分配在相邻的栈空间中。溢出的'\0'会写入s数组之外的内存区域,刚好覆盖了t的存储位置,将t的值修改为0。这直接导致while(t--)的循环条件不再满足,程序提前终止。
注:这种缓冲区溢出属于C语言中的未定义行为,若输入多个非空白字符,会造成更严重的内存破坏,可能引发程序崩溃或其他不可预测的结果。
内容的提问来源于stack exchange,提问作者Nguyễn Tùng Duong
相关产品推荐
相关产品推荐

