《C程序设计语言》中strlen示例为何未初始化变量i?
关于《C程序设计语言》中strlen实现代码的变量初始化疑问
首先明确:这段代码里的变量i不是静态变量,它是函数内部的自动局部变量(栈上分配的变量),按照C标准,这类变量如果没有显式初始化,其初始值是未定义的(随机垃圾值)。
那为什么书中会写出这样的代码?其实这是一个小疏漏——早期C语言的实践中,很多编译器会把未初始化的自动变量默认设为0(尤其是在调试环境下),所以这段代码在当时的环境下大概率能正常运行。但从严格的C标准角度来说,未初始化i直接使用是未定义行为,可能导致程序崩溃或者计算出错误的长度。
正确的写法应该显式初始化i为0:
/* strlen: return length of s */ int strlen(char s[]) { int i = 0; while (s[i] != '\0') ++i; return i; }
书中此时还没讲解静态变量的概念,而i显然也不是外部变量(外部变量定义在函数之外),所以这里就是代码的一个不严谨之处,不用怀疑自己的理解——你察觉到这个问题是完全正确的,严格遵循C标准的话,自动局部变量必须显式初始化后才能使用。
内容的提问来源于stack exchange,提问作者hansoko
相关产品推荐
相关产品推荐

