C语言检查空字符数组的两种判空写法是否等价?
核心结论
这两种写法的判断效果完全不一致,第二种写法属于语法理解错误,根本无法实现判断字符数组内容是否为空的目的。
两种写法的实际逻辑拆解
第一种写法
if(_char_array[0] != '\0') {...}
这是判断C风格空字符串的常规正确写法。逻辑是直接读取字符数组的第一个元素,判断其是否为字符串结束符'\0':如果第一个元素就是结束符,说明当前数组存储的是长度为0的空C风格字符串。
注意这个写法生效的前提是:_char_array是合法初始化的、用于存储C风格字符串(必须以'\0'结尾)的字符数组,如果数组未初始化、或者存储的字符序列没有手动补结束符,判断结果会不可靠。第二种写法
if(_char_array != '\0') {...}
这个写法完全偏离了判断数组内容的目标。C语言中数组名在表达式中会隐式转换为指向数组首元素的内存地址,这里的_char_array实际参与判断的是地址值;而'\0'本质是值为0的整型常量,在指针判断场景下等价于空指针NULL,因此这句代码实际等价于if(_char_array != NULL) {...},仅用来判断数组的首地址是不是空指针,完全没有读取数组内存储的任何内容。
正常场景下这个判断几乎永远为真:只要是你正常定义的栈数组、全局数组、已分配成功的堆数组,首地址绝不可能是0地址,哪怕数组里存的是空串(第一个元素就是'\0'),这个判断也会进入分支,完全达不到判断内容是否为空的效果。
补充提示:如果你的业务场景里“字符数组为空”指的是未存储任何有效内容,除了检查首元素是否为
'\0',还要确保字符数组每次写入内容后都主动在末尾追加了'\0'结束符,否则会因为C字符串没有明确长度标记的特性,出现越界读取、判断失效的问题。
内容的提问来源于stack exchange,提问作者KostasA

