Изначально это нулевой указатель. Но вы сами явно меняете этот указатель и делаете его ненулевым внутри функции myfunc
.
При первом вызове myfunc
вы явно указываете указатель на строковый литерал "Hello World"
. После этого указатель, конечно, больше не равен нулю.
Строковые литералы действительно размещаются в области памяти только для чтения (по крайней мере, концептуально). Однако в C и C ++ вам разрешено указывать на строковые литералы с указателями char *
(т.е. const char *
не требуется) Можно просто указать на строковый литерал с указателем char *
, если вы не пытаетесь изменить литерал. Ваш код не предпринимает никаких попыток что-либо изменить, поэтому все в порядке.
Строковые литералы в C и C ++ имеют статическую продолжительность хранения. Так что нет, они не размещены «в стеке». Они всегда размещаются в статической памяти, что означает, что они живут вечно - до тех пор, пока ваша программа работает.
P.S. Чтобы ответить на ваш вопрос более полно, вы должны объяснить, почему на Земле вы ожидаете, что указатель останется нулевым.
P.P.S. int main
, а не void main
.