getenv, _wgetenv
The latest version of this topic can be found at getenv, _wgetenv.
Gets a value from the current environment. More secure versions of these functions are available; see getenv_s, _wgetenv_s.
Important
This API cannot be used in applications that execute in the Windows Runtime. For more information, see CRT functions not supported with /ZW.
Syntax
char *getenv(
const char *varname
);
wchar_t *_wgetenv(
const wchar_t *varname
);
Parameters
varname
Environment variable name.
Return Value
Returns a pointer to the environment table entry containing varname
. It is not safe to modify the value of the environment variable using the returned pointer. Use the _putenv
function to modify the value of an environment variable. The return value is NULL
if varname
is not found in the environment table.
Remarks
The getenv
function searches the list of environment variables for varname
. getenv
is not case sensitive in the Windows operating system. getenv
and _putenv
use the copy of the environment pointed to by the global variable _environ
to access the environment. getenv
operates only on the data structures accessible to the run-time library and not on the environment "segment" created for the process by the operating system. Therefore, programs that use the envp
argument to main or wmain may retrieve invalid information.
If varname
is NULL
, this function invokes an invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, this function sets errno
to EINVAL
and returns NULL
.
_wgetenv
is a wide-character version of getenv
; the argument and return value of _wgetenv
are wide-character strings. The _wenviron
global variable is a wide-character version of _environ
.
In an MBCS program (for example, in an SBCS ASCII program), _wenviron
is initially NULL
because the environment is composed of multibyte-character strings. Then, on the first call to _wputenv
, or on the first call to _wgetenv
if an (MBCS) environment already exists, a corresponding wide-character string environment is created and is then pointed to by _wenviron
.
Similarly in a Unicode (_wmain
) program, _environ
is initially NULL
because the environment is composed of wide-character strings. Then, on the first call to _putenv
, or on the first call to getenv
if a (Unicode) environment already exists, a corresponding MBCS environment is created and is then pointed to by _environ
.
When two copies of the environment (MBCS and Unicode) exist simultaneously in a program, the run-time system must maintain both copies, resulting in slower execution time. For example, whenever you call _putenv
, a call to _wputenv
is also executed automatically, so that the two environment strings correspond.
Warning
In rare instances, when the run-time system is maintaining both a Unicode version and a multibyte version of the environment, these two environment versions may not correspond exactly. This is because, although any unique multibyte-character string maps to a unique Unicode string, the mapping from a unique Unicode string to a multibyte-character string is not necessarily unique. For more information, see _environ, _wenviron.
Note
The _putenv
and _getenv
families of functions are not thread-safe. _getenv
could return a string pointer while _putenv
is modifying the string, causing random failures. Make sure that calls to these functions are synchronized.
Generic-Text Routine Mappings
TCHAR.H routine | _UNICODE & _MBCS not defined | _MBCS defined | _UNICODE defined |
---|---|---|---|
_tgetenv |
getenv |
getenv |
_wgetenv |
To check or change the value of the TZ
environment variable, use getenv
, _putenv
and _tzset
as necessary. For more information about TZ
, see _tzset and _daylight, timezone, and _tzname.
Requirements
Routine | Required header |
---|---|
getenv |
<stdlib.h> |
_wgetenv |
<stdlib.h> or <wchar.h> |
For additional compatibility information, see Compatibility.
Example
// crt_getenv.c
// compile with: /W3
// This program uses getenv to retrieve
// the LIB environment variable and then uses
// _putenv to change it to a new value.
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
char *libvar;
// Get the value of the LIB environment variable.
libvar = getenv( "LIB" ); // C4996
// Note: getenv is deprecated; consider using getenv_s instead
if( libvar != NULL )
printf( "Original LIB variable is: %s\n", libvar );
// Attempt to change path. Note that this only affects the environment
// variable of the current process. The command processor's
// environment is not changed.
_putenv( "LIB=c:\\mylib;c:\\yourlib" ); // C4996
// Note: _putenv is deprecated; consider using putenv_s instead
// Get new value.
libvar = getenv( "LIB" ); // C4996
if( libvar != NULL )
printf( "New LIB variable is: %s\n", libvar );
}
Original LIB variable is: C:\progra~1\devstu~1\vc\lib
New LIB variable is: c:\mylib;c:\yourlib
.NET Framework Equivalent
System::Environment::GetEnvironmentVariable
See Also
Process and Environment Control
_putenv, _wputenv
Environmental Constants