Is char *envp[] as a third argument to main() portable
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("%sn",*envp++);
}
Is char *envp[]
portable?
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 .
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[]
.
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.
链接地址: http://www.djcxy.com/p/28730.html