首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strcasecmp空参数;man strcasecmp

strcasecmp空参数;man strcasecmp
EN

Stack Overflow用户
提问于 2013-08-21 08:45:06
回答 3查看 2.5K关注 0票数 4

我制作了一个在strcasecmp上运行的小程序,直到我做了这个测试用例才知道为什么:

代码语言:javascript
复制
strcasecmp(NULL, "TEST"); 

在编译时,我收到了以下警告:

代码语言:javascript
复制
test.c:9:4: warning: null argument where non-null required (argument 1) [-Wnonnull]

然而,man strcasecmp没有提到任何关于NULL参数的内容,请有人解释一下,我如何从理论上从阅读文档中推断出这一点,而不是凭经验编写测试用例?这是一个更深层次的标准吗?或者const char *没有权利成为NULL,因为某种原因我不知道?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-21 08:58:57

目前还没有人解释过为什么会这样。

它是不明确的行为。为什么?

除非在下面的详细描述中另有明确说明,否则以下每条语句都适用:如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或当对应的参数不符合const-限定时指向不可修改存储的指针),或者函数的变量数为参数的函数未预期的类型(升级后),则行为未定义。

(C标准,7.1.4)

因为strcasecmp从来没有提到NULL,所以它不在函数的域中。所以这个函数可以随心所欲地做。包括克拉什。

(注:我的消息来源是与此相关的答案:https://stackoverflow.com/a/12621203/1180785)

票数 5
EN

Stack Overflow用户

发布于 2013-08-21 08:49:30

字符串比较strcasecmp需要两个参数,都带有非空字符串.因为两者都是指针,所以NULL也是有效的。然而,strcasecmp可以被定义为:

代码语言:javascript
复制
int strcasecmp(const char *s1, const char *s2) __attribute__((nonnull));

如果至少有一个参数为NULL,则此属性将产生警告。

票数 0
EN

Stack Overflow用户

发布于 2013-08-21 08:51:35

我认为这是假设你对后果有一个粗略的想法。如果您尝试使用非NULL参数,您将有类似的体验:

代码语言:javascript
复制
strcasecmp((const char *)1, "A string");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18352792

复制
相关文章

相似问题

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