为何使用strlen计算无'\0'的字符数组长度未触发报错或警告?
为什么无终止符的字符数组调用strlen既无警告也无报错?
先看这段代码:
char arr[]={'a','b','c'}; int len=strlen(arr);
你提到的问题核心是这段代码存在越界访问的未定义行为,但却没触发警告或报错,主要有这几个原因:
- 编译器静态分析有局限:strlen的参数是
char*,编译器没法在编译阶段彻底验证传入的指针指向的内存区域末尾是否有'\0'。除非是极其明确的错误场景,编译器不会主动去追踪数组后续内存的内容,毕竟这本质上是运行时才会暴露的问题。 - 未定义行为的规则特性:C标准把这种越界访问找
'\0'的情况归为未定义行为——标准没有要求编译器必须对此发出警告或报错,编译器完全可以选择忽略。而且未定义行为不一定会立刻表现出崩溃,可能只是碰巧数组后面的内存刚好有个'\0',或者访问到的内存暂时没影响程序运行,但这都是随机的,换个环境运行可能直接崩溃。 - 默认警告级别不足:大多数编译器默认的警告级别比较宽松,比如GCC只用
-Wall编译时不会检测到这个问题,但如果开启更高的警告级别(比如-Wextra或-Wstringop-overflow),编译器就会给出类似“传入strlen的参数可能缺少终止符”的警告。
内容的提问来源于stack exchange,提问作者Turing-Sheep
相关产品推荐
相关产品推荐

