2013-04-10 46 views
9

getenv("TEMP")を使用していますが、_dupenv_sを使用するよう警告が表示されています。誰も私に_dupenv_sのサンプルコードを教えてもらえますか?

ネットで_dupenv_sの例が見つかりません。

errno_t _dupenv_s(
    char **buffer, 
    size_t *numberOfElements, 
    const char *varname 
); 

をしかし、彼らは何にバッファを参照している:

ドキュメントを読みますか?私はvarnameしか持っていない。バッファを使わないほうが良いでしょうか?

答えて

19

_dupenv_sは、Microsoftの機能であり、より安全な形式のgetenvとして設計されています。

_dupenv_sは、バッファ自体を割り当てます。それにポインタへのポインタを渡さなければなりません。そして、ポインタを新しく割り当てられたバッファのアドレスに設定します。例えば

、あなたが返されたバッファを解放する責任があります

char* buf = nullptr; 
size_t sz = 0; 
if (_dupenv_s(&buf, &sz, "EnvVarName") == 0 && buf != nullptr) 
{ 
    printf("EnvVarName = %s\n", buf); 
    free(buf); 
} 

注意。

+2

GCCの代替手段は何ですか? –

+1

_dupenv_sが0を返すだけで、値が存在するという意味ではありません。 buf == NULLであるかどうかを確認して、存在するかどうかを確認する必要があります。 – kainjow

+0

@MichaelIV 'getenv'の後に' strcpy'が続くか、あるいは 'std :: string'に結果を格納する' std :: getenv'を呼び出す。 – rubenvb

関連する問題