2017-08-25 7 views
1

sscanf()がフォーマット文字列に2つの "%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: '[...] scanf()が呼び出された場合は、free(3) ' –

+1

@AndreKamplingが必要かどうかは疑問でした。 OPはどんな場合でもそれを行うことが安全かどうかを尋ねていた。 –

答えて

4

まず、あなたがそれを2回使用して考える必要がありますので、あなたは、変換仕様のm非標準であることに注意する必要があります。

しかし、あなたの実装がmをサポートしている場合、その後、この用法は限り、あなたは0/NULLにあなたのポインタを初期化するよう安全です。 は、でない場合、(常に安全です)と指定されている場合、scanf()は何も触れることはありません。

+0

これは分かりませんでした.C標準では 'free(0)'は安全ですか?それを参考にしていただけますか? –

+3

@AndreKampling **§7.22.3.3p2 **を参照してください: "*フリー関数は、' ptr'によって指し示されたスペースが解放されるようにします。つまり、 をさらに割り当て可能にします** 'ptr'がNULLポインタ、アクションは発生しません。*** " –

関連する問題