sscanf()获取格式字符串中的两个“%ms”时。
sscanf()返回0或1时,为两个目标指针调用free()是否安全?就像在下一个函数中:

void foo(const char* text)
{
    char* key = NULL;
    char* value = NULL;

    int count = sscanf(text, "%ms %ms", &key, &value);

    if (count == 2)
    {
        ...
    }

    free(key);
    free(value);
}

或者后面的目标指针(value)是否有一些垃圾值?
需要进行以下清理:
void bar(const char* text)
{
    char* key = NULL;
    char* value = NULL;

    int count = sscanf(text, "%ms %ms", &key, &value);

    if (count == 2)
    {
        ...
        free(key);
        free(value);
    }
    else if (count == 1)
    {
        free(key);
    }
}

最佳答案

首先,您应该知道转换规范中的m是非标准的,所以您应该考虑使用它两次:您的代码将是不可移植的。
但是,如果您的实现支持m,那么只要您将指针初始化到0/NULL,这种用法就安全了。scanf()如果无法转换,并且free(0)被指定为禁止操作(它总是安全的),则从不接触任何东西。

10-08 07:36
查看更多