首页 > 解决方案 > 在 C 中同时使用 strlen 和断言

问题描述

我知道我们想assert在我们想检查不可能的情况时使用。在我的一本书中,我看到了以下两个例子:

void foo(char* str) { assert ((str+strlen(str)) != NULL); }
void bar(char* str) { assert (str[strlen(str)] != NULL); }

我试图弄清楚它们是否是有效的支票。据我了解,第一个示例无效,因为我们检查地址是否NULL正确且不正确。但我不确定我们在第二个示例中检查的是什么。我很难理解什么时候该使用assert. 我理解“检查不可能的情况”的解释,但每种情况都有点不同。

编辑:我之前展示的功能和那些功能之间有区别吗?:

void foo(char* str) { assert (!(str+strlen(str))}
void bar(char* str) { assert (! str[strlen(str)]); }

标签: cassertc-stringsstrlen

解决方案


第二个有点奇怪。我认为您的书可能一直试图表明的是所有 c 字符串都需要以空/零字符结尾。然而,strlen 的工作方式是它会继续扫描字符串,直到找到一个空字符。因此,在秒的情况下,它要么找到一个空字符,要么在读取无效内存时出现分段错误,您的程序将崩溃。所以基本上断言没有意义,因为它要么通过,要么程序崩溃。

实际上,第一个也遇到了同样的问题。因为即使将空指针传递给 foo,空指针的 strlen 也可能会导致崩溃。这样做会更有意义assert(str != NULL)


推荐阅读