C标准库中有许多可爱的字符串函数,例如(string.h
)
char *strcat(char *str1, const char *str2);
或(在stdlib.h
)
long int strtol(const char *nptr, char **endptr, int base);
(出于这个问题的目的,忽略调用这些函数的智慧。)
如果我将这些函数中的任何一个传递给NULL
指针,会发生什么? (我的意思是(char *) 0
,而不是空字符串。)
我在手册页或网页上找不到任何答案。
这使我认为它是实现定义的,但它也可能意味着自动分段错误;也没有指定特殊的错误行为或返回值。
在相同的实现中,行为甚至会因功能而异吗?
答案 0 :(得分:7)
C标准在 7.21.1字符串函数约定,第2条中说明了它:
除非在特定描述中另有明确说明 在这个子句中的函数,这样一个调用的指针参数应该 仍有有效值,如7.1.4所述。
7.1.4使用库函数:
如果函数的参数具有无效值(例如值) 在函数域之外,或者在地址之外的指针 程序的空间,或空指针,或指向 不相应的参数时不可修改的存储 const-qualified)或类型(促销后)不期望的 函数具有可变数量的参数,行为未定义。
strcat()
在 7.21.3.1 中的描述没有说明NULL指针是一个有效的输入,因此,我得出结论,如果任何输入指针是行为,则行为是正式未定义的。 NULL。
答案 1 :(得分:2)
标准没有说什么,所以它是未定义的行为。在许多平台上,你会得到一个seg-fault,因为它将取消引用一个空指针。
答案 2 :(得分:2)
除非它指定了函数对NULL值的作用(例如endptr
定义为NULL),否则结果为undefined - 崩溃,错误代码,中止或恶魔
答案 3 :(得分:0)
C规范没有提到如果你将错误的参数传递给例如strcat
和类似的函数,所以它完全依赖于实现。但我敢打赌,至少在发布版本中没有多少实现检查NULL
参数。
答案 4 :(得分:0)
这将取决于实施。但是你会在许多实现上遇到段错误。由于字符串函数被广泛使用,因此这些库函数通常会执行nullcheck。 (必须是因为效率)
编辑:正如@Alex提到的那样,它不依赖于实现;这是未定义的。