2013-04-10 123 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是微軟的一項功能,設計爲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的替代選擇是什麼? – 2014-09-29 10:01:47

+1

僅僅因爲_dupenv_s返回0並不意味着該值存在。你仍然需要檢查buf == NULL來驗證它是否存在。 – kainjow 2014-11-26 16:10:33

+0

@MichaelIV'getenv'後跟一個'strcpy'或者C++,調用'std :: getenv'將結果存儲在'std :: string'中。 – rubenvb 2016-08-30 12:04:35

相關問題