将空字符串赋给C标准函数会发生什么?

时间:2011-11-30 11:25:10

标签: c string null std

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,而不是空字符串。)

我在手册页或网页上找不到任何答案。

这使我认为它是实现定义的,但它也可能意味着自动分段错误;也没有指定特殊的错误行为或返回值。

在相同的实现中,行为甚至会因功能而异吗?

5 个答案:

答案 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提到的那样,它不依赖于实现;这是未定义的。