最后环境的打印地址

时间:2013-10-16 16:14:10

标签: c linux

我需要打印环境的最后一个地址。

我知道我可以用这个得到第一个地址(或者我认为我做过)。

extern char **environ;
printf("first address %p\n",&(*environ));

但是最后一个地址呢?

3 个答案:

答案 0 :(得分:6)

man environ是一个很好的起点。

char **pp = environ;
for( ; *pp; pp++) {
   printf("%s\n", *pp);
} 
printf("The end of environ is %p\n", pp);

将打印出环境变量;我相信它们的形式是“名称=价值”。

询问最后一个看起来很奇怪,因为它们没有特别的顺序,除了它们在shell中设置的顺序。

答案 1 :(得分:2)

传统上,正如environ(7)所述,environ数组以NULL指针结尾。

实际上,内核在execve(2)之后设置进程的初始堆栈,并且环境在具有结尾NULL的初始堆栈上传递。因此,根据application binary interface,在内核中实现了该约定的一部分。约定的另一部分是在启动例程中实现的 - 这是crt*.o中可执行文件的入口点,它调用main并设置environ

所以你只需要在Charlie Burns' answer中创建一个循环来找到它的结尾,例如

char** environ_end;
for (environ_end = environ; *environ_end != NULL; environ_end ++) {};
// at this point, environ_end points to the end of the environment
// i.e. to the ending NULL entry there.

答案 2 :(得分:2)

如果environ数组以NULL结尾,(有时是main()的第3个参数)

extern char **environ;

int i = 0;
while (environ[i] != NULL) {
  printf("environ[%d] = %p\n", i, environ[i]);
  i++;
}
// environ is a "pointer to pointer to char".  See http://cdecl.org/
// The last useful pointer in array `environ` should be a NULL.
printf("last address(or pointer) of the environment = %p\n", environ[i]);
// The address(pointer) of that last pointer(pointer) is ...
printf("address of the last address of environ = %p\n", &environ[i]);