Это совершенно безопасно.
Вы возвращаетесь по значению. Что приведет к неопределенному поведению, если вы вернетесь по ссылке.
//safe
mystruct func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
return retval;
}
//undefined behavior
mystruct& func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
return retval;
}
Поведение вашего фрагмента совершенно корректно и определено. Это не зависит от компилятора. Все нормально!
Лично я всегда либо возвращаю указатель на структуру malloc'а
Ты не должен. Вам следует избегать динамически выделяемой памяти, когда это возможно.
или просто сделайте передачу по ссылке на функцию и измените значения
есть.
Эта опция совершенно действительна. Это вопрос выбора. В общем, вы делаете это, если хотите вернуть что-то еще из функции, изменяя исходную структуру.
Потому что, насколько я понимаю, однажды сфера действия функции
более того, любой стек, использованный для размещения структуры, может быть
перезаписаны
Это неправильно. Я имею в виду, это вроде правильно, но вы возвращаете копию структуры, которую вы создаете внутри функции. Теоретически . На практике RVO может и, вероятно, произойдет. Читайте об оптимизации возвращаемого значения. Это означает, что хотя retval
выходит из области видимости после завершения функции, она может быть встроена в вызывающий контекст, чтобы предотвратить дополнительное копирование. Это оптимизация, которую компилятор может реализовать бесплатно.