You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:06