Насколько я понимаю, когда вы создаете переменную const, ей выделяется память, в которой она хранится, как и любая другая переменная. В зависимости от компилятора, если вы поместите это const 3 в функцию, он может выделять temp 3 каждый раз, когда вы вызываете функцию, или он может просто ссылаться на статическое значение, назначенное при запуске программы. Эта 3 - реальная переменная в том смысле, что это данные, которые хранятся где-то, как и любая другая переменная.
Однако обращение к этому значению за пределами его области будет безрассудной попыткой выяснить, будет ли оно работать, и поэтому вам не следует использовать это как способ «продлить жизнь» переменной. Возможно, вам повезет, и const будет размещен в статическом месте, и вы всегда получите желаемое значение, даже если вы получите к нему доступ вне области видимости; но вам может не повезти, и в конечном итоге вы получите данные, которые записаны с желаемым временным значением. Поведение «неопределено» - это означает, что компиляторы сами решают, как они хотят это сделать, поэтому вы не можете рассчитывать на это. Вместо этого увеличьте область действия переменной, объявив ее раньше или выделив ее в куче (int* x = malloc(sizeof(int))//, etc.
и передав ее указатель.