Ваш код имеет неопределенное поведение (что означает сбой не гарантируется!), Но не по той причине, о которой вы думаете.
InAFunc()
принимает test
объект по значению , поэтому копия входного test
объекта создается при вызове InAFunc()
. Любые изменения, которые InAFunc()
вносит в свой параметр kio
, являются локальными для InAFunc()
и не отражаются обратно для вызывающей стороны.
Переменная mmk
в main()
сконструирована по умолчанию, поэтому предположительно mmk.Name
и mmk.ARR
имеют значение NULL (хотя вы не показали код для этого конструктора), и InAFunc()
не будет перезаписывать тот. неопределенное поведение передавать указатель NULL char*
на operator<<
или индексировать указатель NULL int*
.
Возможно, вы хотели InAFunc()
вывести новый объект test
, который он создает. В этом случае параметр kio
необходимо передать по ссылке вместо по значению :
void InAFunc(test &kio)
Теперь переменная mmk
в main()
получит значения, которые присваивает InAFunc()
. mmk.Name
и mmk.ARR
больше не будут равны NULL.
Теперь вы будете назначать указатель на строковый литерал на mmk.Name
, а строковый литерал находится в постоянной доступной только для чтения памяти в течение всего времени жизни процесса, поэтому передача mmk.Name
в operator<<
будет четко определена и не приведет к сбою.
Однако mmk.ARR
действительно будет указывать на массив, локальный для InAFunc()
и больше не будет действительным после выхода InAFunc()
, как вы и предполагали. Таким образом, вы будете иметь неопределенное поведение при попытке индексирования в mmk.ARR
(хотя память, на которую указывает mmk.ARR
, вероятно, все равно будет выделена , поэтому код, скорее всего, будет не сбой).