我需要打印环境的最后一个地址。
我知道我可以用这个得到第一个地址(或者我认为我做过)。
extern char **environ;
printf("first address %p\n",&(*environ));
但是最后一个地址呢?
答案 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]);