首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空参数对strstr的行为是什么?

空参数对strstr的行为是什么?
EN

Stack Overflow用户
提问于 2013-10-25 01:24:22
回答 2查看 9.9K关注 0票数 7

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

给予:

代码语言:javascript
复制
char * p = NULL;
char * s = NULL;

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

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

案例3:strstr(p, s);

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

根据Microsoft文档,他们执行参数验证并在那里处理它。见备注部分。

我们在上使用C99。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-25 01:57:42

ISO C标准说,这种行为是未定义的。

引用作为2011年国际标准化组织标准草案的N1570,第7.1.4节:

除非在下面的详细描述中另有明确说明,否则以下每条语句都适用:如果函数的参数具有无效值(例如.或空指针,.),则行为未定义。

7.24.5.7中对strstr的描述是:

strstr函数定位由s1指向的字符串中s2指向的字符串中的字符序列(不包括终止空字符)中的第一个匹配项。

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

在C90和C99标准中,这些语句(如果不是相同的话)是相似的。

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

代码语言:javascript
复制
#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)打印:

代码语言:javascript
复制
p == NULL

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

票数 5
EN

Stack Overflow用户

发布于 2013-10-25 01:32:37

对于未定义的行为,您几乎可以预料到崩溃。

MSFT表示,对于strstr参数:“如果str或strSearch为NULL,则调用无效的参数处理程序”和“默认无效参数调用沃森崩溃报告,这将导致应用程序崩溃”(http://msdn.microsoft.com/en-us/library/vstudio/ksazx244.aspx)。

但是,您可以通过使用函数_set_invalid_parameter_handler来改变这一点(至少在MSFT中是这样)。当调用该函数时,您必须决定如何恢复,以及是否应该通知用户,或者程序是否可以继续。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19579574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档