2

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

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

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

但是最后一个地址呢?

4

3 回答 3

6

man environ是一个很好的起点。

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

会打印出环境变量;我相信它们是“name=value”的形式。

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

于 2013-10-16T16:17:51.847 回答
2

通常,如environ(7)所述,environ数组以NULL指针结尾。

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

所以你只需要像查理伯恩斯的回答那样做一个循环来找到它的结尾,例如

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.
于 2013-10-16T16:18:16.457 回答
2

如果 environ 的数组以 NULL 结尾,(如有时在 的第三个参数中main()

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]);
于 2013-10-16T16:20:00.927 回答