2017-08-25 50 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'是一個空指針,不會發生任何操作***「 –