C语言数组异常行为:输入超长字符串仍可正确计数的原因
问题解析:C语言数组越界为何未报错还能统计长度
你遇到的情况本质是数组越界引发的未定义行为,下面具体拆解原因:
1. 数组越界的本质
你定义了char mystring[5],系统只为它分配了5个连续字节的内存(其中最后一个字节本该留给字符串结束符\0)。但用scanf("%s", &mystring)输入超长字符串时,scanf会把超出数组长度的字符直接写到数组内存区域之外的空间里,这就触发了C语言里的数组越界访问,属于标准定义的「未定义行为」。
2. 为什么没报错还能正确统计长度
- 未定义行为不是必然会崩溃或弹出报错,它的结果完全不可预测。你的程序能正常统计,只是当前环境下的「运气」:越界写入的内存区域刚好没有被程序的其他关键数据(比如函数栈帧里的其他变量、返回地址等)占用,而且
scanf依然能在输入字符串的末尾正常写入\0结束符。 - 你的
mylen函数逻辑是遍历到\0就停止计数,只要这个\0能被正常访问到,函数自然就能算出正确的字符数。但如果换个运行环境,或者程序里新增了其他变量占用了越界区域,很可能会出现程序崩溃、变量值被篡改、统计结果错误等各种问题。
3. 代码里的小细节问题
你写的scanf("%s", &mystring)其实没必要加&:数组名mystring会自动隐式转换为指向数组第一个元素的char*指针,和scanf要求的参数类型完全匹配。&mystring的类型是char (*)[5](指向5字符数组的指针),虽然能被隐式转换,但写法不规范,建议直接写成scanf("%s", mystring)。
附你的代码:
#include <stdio.h> int mylen(char*); int main(){ char mystring[5]; printf("Enter a string: "); scanf("%s", &mystring); int lenght = mylen(mystring); printf("The string is %d chars long", lenght); return 0; } int mylen (char *ptr) { int len; len = 0; char t; while (*ptr != '\0'){ ptr++; len ++; } return len; }
内容的提问来源于stack exchange,提问作者shark_sh
相关产品推荐
相关产品推荐

