Просто чтобы расширить ответ BlodBath, подумайте о том, что происходит в памяти, когда вы делаете это.
Когда вы вводите основную подпрограмму, создается новая автоматическая структура Test - в стеке, так как она автоматическая. Таким образом, ваш стек выглядит примерно так:
| return address for main | will be used at bottom
| argc | copied onto stack from environment
| argv address | copied onto stack from environment
-> | test.number | created by definition Test test;
с ->
, указывающим указатель стека на последний использованный элемент стека.
Теперь вы вызываете Test_new()
, и он обновляет стек следующим образом:
| return address for main | will be used at bottom
| argc | copied onto stack from environment
| argv address | copied onto stack from environment
| test.number | created by definition Test test;
| return addr for Test_new| used to return at bottom
| copy of test.number | copied into the stack because C ALWAYS uses call by value
-> | 10 | copied onto stack
Когда вы возвращаете &t
, какой адрес вы получаете? Ответ: адрес данных НА СТЕКЕ. НО после того, как вы вернетесь, указатель стека уменьшается. Когда вы вызываете printf
, эти слова в стеке используются повторно, но ваш адрес по-прежнему указывает на них. Бывает, что то, на что указывает число в этом месте в стеке, интерпретируемом как адрес, имеет значение 4206602, но это чистый шанс; на самом деле, это было своего рода неудача, поскольку удача удача была бы чем-то, что вызвало ошибку сегментации, давая вам знать, что что-то действительно сломалось.