__ environment и т.д ... не находятся в стеке;они являются обычными глобальными переменными, которые являются указателями (то есть переменной, значение которой является адресом) на места в стеке.Тот факт, что исходная программная среда, аргументы и т. Д. Находятся в стеке, является деталью реализации.Они также могут быть легко размещены в куче или в какой-либо другой области, подходящей для среды выполнения.
Единственное, что важно, - это то, что среда выполнения и операционная система договариваются о том, где их найти.
[отвечает на комментарий] Приведенная ниже программа должна иллюстрировать:
#include <stdio.h>
extern char **environ;
int main() {
int x;
printf("&envrion = %p\n", &environ);
printf("environ = %p\n", environ);
printf("*environ = %p [%s]\n", *environ, *environ);
printf("&x = %p\n", &x);
return 0;
}
в моей системе при запуске (cc -static xc; ./a.out) выдает:
&envrion = 0x6bbda8
environ = 0x7ffdd6edb3e8
*environ = 0x7ffdd6edb9a2 [CLUTTER_IM_MODULE=xim]
&x = 0x7ffdd6edb2a4
Обратите внимание, что & environment находится по адресу, который сильно отличается от окружающей среды, * environment и & x.Это потому, что последние находятся в стеке, а сама среда - нет.