a
является локальной переменной, поэтому при завершении функции enque
переменная a
уничтожается.
Теперь в C и C ++ слово "destroy" не обязательно означает, что данные больше не находятся по этому адресу.Это означает, что данные могут больше не находиться по этому адресу, поскольку этот адрес может быть повторно использован для других целей в любое время.Вы не можете ожидать, что это все еще будет там.
На практике , если вы не используете оптимизацию , то, что , скорее всего, произойдет, это то, что пространство, где хранились локальные переменные enque
, будетполучить повторно при следующем вызове функции.Между enque
возвратом и чтением (&q)->front->data
нет вызова функции (printf
не вызывается, пока не получен доступ к значению), поэтому значение 11 все еще находится в этом месте.Затем вызвал printf
, и printf
имеет несколько локальных переменных, которые хранятся в той же ячейке памяти, где были локальные переменные enque
.Поэтому во второй раз, когда вы читаете (&q)->front->data
, вы читаете одну из локальных переменных из последнего вызова printf вместо одной из локальных переменных из enque
.
Примечание: Это ненадежновообще - вы можете получить другие результаты, если будете использовать другой компилятор, другую версию того же компилятора, другую версию вашей операционной системы, другую версию библиотеки, если вы включите оптимизацию или еслипланеты не выровнены правильно.Он мог бы дать вам 11 раз, значения мусора оба раза, сбой или даже более странные вещи (т. Е. Именно поэтому это называется неопределенное поведение - буквально означающее «компьютер может делать все что угодно» - и вам следуетизбегайте этого (вы можете подумать, что худшее, что может случиться, - это получить мусор, но когда оптимизаторы включаются, их, как правило, смущают подобные вещи)