Я пытаюсь понять фрейм стека в C, поэтому я написал простой C-код для анализа фрейма стека.Понимание стековых фреймов в C
Прежде всего fun1() возвращает адрес локальной переменной, которая инициализируется 10 до PTR, что приводит к предупреждению, но это нормально ... Если я теперь напечатает значение * PTR печатает 10, даже это прекрасно ...
Следующий fun2() возвращает адрес локальной переменной, которая даже не инициализирована, и если я попытаюсь напечатать значение * ptr, теперь он печатает 10 независимо от того, возвращая адрес a или b ...
Чтобы понять, что на самом деле происходит здесь, я использовал gdb. Использование GDB, я начал шаг за шагом отладки и когда я дошел до линии «возвращение &» в fun2(), я пытался напечатать адрес б, печать & б но напечатанное Не может введите адрес «b», который не является значением lvalue.
Я не понимаю, когда я пытаюсь напечатать адрес, печати & печатает абсолютно нормально, то почему бы не обратиться Ь. * Почему нет b значения l, когда оно есть?
# include <stdio.h>
int * fun1() {
int a = 10;
return &a;
}
int * fun2()
{
int a;
int b;
return &a; // return &b;
}
int main()
{
int *ptr;
ptr = fun1();
ptr = fun2();
printf ("*ptr = %d, fun2() called...\n", *ptr);
return 0;
}
http://stackoverflow.com/a/18479996/1814023 –
вы вызываете неопределенное поведение. Нет никакой гарантии, что результаты будут иметь какой-либо смысл или будут делать то, что вы ожидаете от макета стека. Стандартная гипербола заключается в том, что программе разрешено делать [демоны] (http://www.catb.org/jargon/html/N/nasal-demons.html) вылетающим из носа. – user2357112
Вам повезло, что печать '* ptr' печатает 10; это, безусловно, не гарантируется (вы вызываете неопределенное поведение). Но вы действительно должны показать весь код. В коде компилятор, вероятно, сбросил 'b' как неиспользуемую переменную, поэтому у него нет местоположения, поэтому вы не можете взять его адрес. Используйте 'b' в коде, так или иначе, и вы сможете его распечатать. И, пожалуйста, не сообщайте «что-то вроде»; быть точным и сообщать точно, что говорит отладчик. –