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

Ros*_*her 2 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...
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 6

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

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

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