我需要打印环境的最后一个地址。
我知道我可以用这个得到第一个地址(或者我想我做到了)。
extern char **environ;
printf("first address %p\n",&(*environ));
但是最后一个地址呢?
man environ
是一个很好的起点。
char **pp = environ;
for( ; *pp; pp++) {
printf("%s\n", *pp);
}
printf("The end of environ is %p\n", pp);
会打印出环境变量;我相信它们是“name=value”的形式。
询问最后一个似乎很奇怪,因为它们没有特定的顺序,除了它们在 shell 中设置的顺序。
通常,如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.
如果 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]);