为何char数组mystring长度为5,fgets设更大限制后长度超5?
问题分析:数组越界引发的未定义行为
你的代码出现异常结果的核心原因是数组越界写入导致的未定义行为,具体拆解如下:
数组内存的实际限制
你定义的char mystring[5]仅在栈上分配了5个连续字节的内存(索引范围0-4),最多只能容纳4个有效字符加1个字符串结束符'\0'。fgets的执行逻辑
fgets的第二个参数指定的是它最多读取的字符总数(包含结束符'\0')。当你传入10时,fgets会尝试读取最多9个字符(预留1个位置存'\0'),完全不会检查目标数组的实际大小。当你输入8个字符加回车(共9个字符),fgets会把这些字符依次写入内存:写完mystring的5个字节后,剩余字符会继续写入数组后方的栈内存区域——这就是数组越界。strlen的计算规则
strlen从传入的起始地址开始逐个字节扫描,直到找到'\0'才停止,返回的是'\0'之前的字符数量。由于越界写入后,'\0'被存到了mystring数组范围外的栈内存中,从mystring起始地址到这个'\0'之间刚好有9个字符,因此strlen返回9。
⚠️ 重要提示:这种越界行为属于C语言中的未定义行为,这次只是返回异常长度,下次可能直接导致程序崩溃、数据损坏或其他不可预测的结果,绝对不能依赖该行为。
正确写法
将fgets的第二个参数改为数组的实际长度(用sizeof自动获取,避免手动计算出错),确保写入不会超出数组边界:
#include <stdio.h> #include <string.h> int main() { char mystring[5]; // 使用sizeof获取数组实际长度,限制fgets的写入范围 fgets(mystring, sizeof(mystring), stdin); printf("len: %zu", strlen(mystring)); // strlen返回值为size_t类型,用%zu格式符更规范 }
内容的提问来源于stack exchange,提问作者Helix Development
相关产品推荐
相关产品推荐

