Is char *envp[] as a third argument to main() portable

CEnvironment VariablesMainPortabilityFunction Signature

C Problem Overview


In order to get an environment variable in a C program, one could use the following:

  • getenv()
  • extern char **environ;

But other than the above mentioned, is using char *envp[] as a third argument to main() to get the environment variables considered part of the standard?

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while(*envp)
        printf("%s\n",*envp++);
}

Is char *envp[] portable?

C Solutions


Solution 1 - C

The function getenv is the only one specified by the C standard. The function putenv, and the extern environ are POSIX-specific.

###EDIT

The main parameter envp is not specified by POSIX but is widely supported.

> An alternative method of accessing the environment list is to declare > a third argument to the main() function: > > int main(int argc, char *argv[], char *envp[]) > > This argument can then be treated in the same way as environ, with the > difference that its scope is local to main(). Although this feature is > widely implemented on UNIX systems, its use should be avoided since, > in addition to the scope limitation, it is not specified in SUSv3.

Solution 2 - C

It isn't portable. *envp[] is a traditional UNIX thing, and not all modern UNIX systems implement it.

Also as a side note you could access envp by doing a pointer traversal over *argv[], overflowing it...but i don't think that can be considered safe programming. If you take a look at the process memory map you will see that envp[] is just above argv[].

Solution 3 - C

The Standard describes two formats for main (see 5.1.2.2.1 in the C99 Standard (pdf))

a) int main(void)

and

b) int main(int argc, char **argv) or equivalent

and it allows implementations to define other formats (which can allow a 3rd argument)

c) or in some other implementation-defined manner.

Solution 4 - C

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSangeeth SaravanarajView Question on Stackoverflow
Solution 1 - CcnicutarView Answer on Stackoverflow
Solution 2 - CskyelView Answer on Stackoverflow
Solution 3 - CpmgView Answer on Stackoverflow
Solution 4 - Cuser3683366View Answer on Stackoverflow