Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

Some environments provide environment pointers that are valid when main() is called, but may be invalided by operations that modify the environment.

Wiki MarkupAccording to C99 \ [[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\]

Wiki MarkupIn a hosted environment, the main function receives a third argument, {{char \ *envp\[\]}}, that points to a null-terminated array of pointers to {{char}}, each of which points to a string that provides information about the environment for this execution of the program.

Consequently, under a hosted environment it is possible to access the environment through a modified form of main():

...

Noncompliant Code Example (POSIX)

Wiki MarkupAfter a call to the POSIX {{setenv()}} function, or another function that modifies the environment, the {{envp}} pointer may no longer reference the environment. POSIX states that \ [[Open Group 2004|AA. Bibliography#Open Group 04]\]

Unanticipated results may occur if setenv() changes the external variable environ. In particular, if the optional envp argument to main() is present, it is not changed, and as a result may point to an obsolete copy of the environment (as may any other copy of environ).

...

After a call to the Windows _putenv_s() function, or other function that modifies the environment, the envp pointer may no longer reference the environment.

Wiki MarkupAccording to the Visual C++ reference \ [[MSDN|AA. Bibliography#MSDN]\]

The environment block passed to main and wmain is a "frozen" copy of the current environment. If you subsequently change the environment via a call to putenv or _wputenv, the current environment (as returned by getenv / _wgetenv and the _environ / _wenviron variable) will change, but the block pointed to by envp will not change.

...

ISO/IEC 9899:1999 Section J.5.1, "Environment Arguments"

Bibliography

Wiki Markup\[[MSDN|AA. Bibliography#MSDN] \] [{{getenv, _wgetenv}}|http://msdn.microsoft.com/en-us/library/tehxacec.aspx], [{{_environ, _wenviron}}|http://msdn.microsoft.com/en-us/library/stxk41x1.aspx], [{{_putenv_s, _wputenv_s}}|http://msdn.microsoft.com/en-us/library/eyw7eyfw.aspx] \[[Open Group 2004|AA. Bibliography#Open Group 04]\] [{{setenv()}}|http://www.opengroup.org/onlinepubs/009695399/functions/setenv.html]
[Open Group 2004] setenv()

...

      10. Environment (ENV)      ENV32-C. All atexit handlers must return normally