gpt4 book ai didi

c - NULL 参数对 strstr 的行为是什么?

转载 作者:太空狗 更新时间:2023-10-29 15:02:23 25 4
gpt4 key购买 nike

strstr 中将 NULL 作为参数传递时的行为是什么?

给定:

char * p = NULL;
char * s = NULL;

案例 1:strstr(p, "Hello");

案例 2:strstr("With my dog", p);

案例 3:strstr(p, s);

我的理解是行为是未定义的,并留给所有 3 种情况的实现。

根据 Microsoft Visual Studio 文档,他们执行参数验证并在那里进行处理。 See Remarks section.

我们在 IAR Workbench 上使用 C99。

背景:一些测试人员正在编写单元测试并将 NULL 分配给字符串变量。

最佳答案

ISO C 标准规定该行为未定义。

引用 N1570 ,这是 2011 ISO C 标准的草案,第 7.1.4 节:

Each of the following statements applies unless explicitly stated otherwise in the detailed descriptions that follow: If an argument to a function has an invalid value (such as [...], or a null pointer, [...], the behavior is undefined.

7.24.5.7 中strstr 的描述说:

The strstr function locates the first occurrence in the string pointed to by s1 of the sequence of characters (excluding the terminating null character) in the string pointed to by s2.

其中,除了 7.1.4 中的语句外,还表示参数必须指向某个字符串(空指针不指向)。

这些语句在 C90 和 C99 标准中即使不完全相同也是相似的。

请注意,“未定义的行为”并不意味着程序一定会崩溃。例如这个程序:

#include <stdio.h>
#include <string.h>
int main(void) {
char *p = strstr(NULL, "");
if (p == NULL) {
printf("p == NULL\n");
}
else {
printf("p = %p\n", p);
}
}

在我的系统(Linux、gcc 4.7.2、glibc 2.15)上编译和运行时打印:

p == NULL

可能是因为 strstr 优化了第二个参数为空字符串的情况。未定义的行为是不需要检测或诊断的错误;作为程序员,您有责任首先避免未定义的行为。

关于c - NULL 参数对 strstr 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19579574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com