Is char *envp[] as a third argument to main() portable
CEnvironment VariablesMainPortabilityFunction SignatureC 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
The 3rd argument is valid in Microsoft C and GNU GCC: