检查参数是否为NULL的好习惯

时间:2014-06-29 02:12:42

标签: c

我目前正在研究字符串度量库,它计算字符串之间的各种距离,并报告字符串彼此之间的相似程度。例如Levenshtein距离(https://en.wikipedia.org/wiki/Levenshtein_distance)。

unsigned levenshtien(const char *str1, const char *str2)
{
    // check for NULL pointers
    if (str1 == NULL && str2 == NULL)
        return 0;

    if (str1 != NULL && str2 == NULL)
        return strlen(str1);

    if (str1 == NULL && str2 != NULL)
        return strlen(str2);

    // calculate length of strings
    size_t str1_len = strlen(str1);
    size_t str2_len = strlen(str2);

    // handle cases where one or both strings are empty
    if (str1_len == 0)
        return (str2_len == 0) ? 0 : 1;

    // calculate stuff here...
}

库中的每个函数都传递const char *个指针。我想知道检查每个指针是否为NULL是否常见?或者我应该假设使用库的程序员在传递指针之前会检查?

2 个答案:

答案 0 :(得分:6)

这取决于记录的界面。如果函数被记录为带有两个非空字符串,那么您可以添加一个断言,它们不是null,并且在没有进一步检查的情况下继续使用。如果记录该函数来处理空指针,就好像它们指向空字符串或类似的东西一样,那就没问题,你必须根据需要进行检查和调整。检查和处理无效参数没有任何问题,因为即使函数被记录为使用非空指针指向有效的以空字符结尾的字符串,您的代码仍会执行,但它会使您的代码增加,从而使那些能够阅读文档的人获益​​最少。< / p>

标准C库函数(例如strcmp())只需要将参数作为有效字符串。如果向其传递空指针,则调用未定义的行为。它可能会在实施者的心血来潮中崩溃,也可能不会崩溃。

对于您的功能,用户只提供有效指针似乎是合理的;保证他们诚实的主张是好的,这就是所需要的。

答案 1 :(得分:0)

始终检查潜在的错误情况并适当处理它们(抛出异常,返回错误代码,什么也不做,等等)。没有空指针异常不是一件好事。