2017-08-25 102 views
1

sscanf()在格式字符串中获得两个“%ms”时。 当sscanf()返回0或1时,为两个目标指针调用free()是否安全?例如下面的功能:sscanf和多个%ms

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); 
    } 
} 
+1

阅读下面的示例和解释:https://linux.die.net/man/3/sscanf:[[...]只需要调用free(3)如果scanf()调用成功读取一个字符串。“# –

+1

@AndreKampling但问题不在于它是否有必要*。 OP在询问在任何情况下是否安全。 –

回答

4

首先,你应该知道,m在转换说明非标准,所以你应该考虑使用它两次:您的代码将是不可移植。

不过,如果你的实现支持m,这种用法是安全只要你初始化指针0/NULLscanf()当没有可能的转换并且free(0)被指定为否op(它总是安全的)时从不触及任何东西。

+0

不知道:C标准是免费的(0)'安全吗?你可以参考一下吗? –

+3

@AndreKampling参见**§7.22.3.3p2 **:“* free函数导致'ptr'指向的空间被释放,也就是使 可用于进一步的分配**如果'ptr'是一个空指针,不会发生任何操作***“ –