c - 在 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)]); }
解决方案
第二个有点奇怪。我认为您的书可能一直试图表明的是所有 c 字符串都需要以空/零字符结尾。然而,strlen 的工作方式是它会继续扫描字符串,直到找到一个空字符。因此,在秒的情况下,它要么找到一个空字符,要么在读取无效内存时出现分段错误,您的程序将崩溃。所以基本上断言没有意义,因为它要么通过,要么程序崩溃。
实际上,第一个也遇到了同样的问题。因为即使将空指针传递给 foo,空指针的 strlen 也可能会导致崩溃。这样做会更有意义assert(str != NULL)
。
推荐阅读
- embedded - 将局部变量地址传递给 ARM-v7 的扩展内联 ASM 的最有效方法是什么?
- scala - intelliji 中的 Scala Maven 项目在保存时不会自动编译
- python - 我正在训练我的实时对象检测模型,但我不知道是在命令提示符下还是在虚拟环境的 Anaconda 提示符下运行命令
- java - 弹簧和弹簧安全过滤器的过滤周期
- indexing - 谷歌共享驱动器可以被 Windows 索引编制索引吗?
- java - 如何在 android 的循环进度条中将变量作为 setIndicatorSize 的参数?
- react-native - 我们没有找到使用 mesibo SDK 在本机反应中创建新 UI 的代码
- python - 使用从 python 文件到 kv 文件的变量的 kivy 错误
- r - 如何在 R 中跨多个数据帧沿单列迭代函数
- django - 信号和任务文件未在 django celery 中连接