Если я запустил программу, просто как
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
printf("My references are at %p, %p, %p\n", &argc, &argv, &env);
}
Мы видим, что эти области находятся в стеке. Но что еще есть? Если мы запустили цикл по всем значениям в Linux 3.5.3 (например, до segfault), мы увидим некоторые странные числа, а вид двух регионов, разделенных кучей нулей, возможно, чтобы попытаться предотвратить перезапись переменных среды случайно.
Во всяком случае, в первой области должно быть много номеров, таких как все кадры для каждого вызова функции.
Как мы можем отличить конец каждого кадра, где находятся параметры, где канарейка, если компилятор добавил один, обратный адрес, статус CPU и т.д.