Это опасная ошибка, скрывающаяся в вашем коде. В C и C ++ вам не разрешено
вернуть указатель на данные стека в функции. Это приводит к неопределенному поведению. Я объясню почему.
Программа на C / C ++ работает, помещая данные в стек программ и из него. Когда вы вызываете функцию, все параметры помещаются в стек, а затем все локальные переменные также помещаются в стек. По мере выполнения программы она может помещать и выгружать больше элементов в стек вашей функции. В вашем примере, буфер помещается в стек, а затем t помещается в
стек. Стек может выглядеть так:
- Предыдущий стек
- Параметры
- (другие данные)
- буфер (50000 байт)
- т (размер указателя)
В этот момент t находится в стеке, и указывает на буфер , который также находится в стеке.
Когда функция возвращается, среда выполнения выталкивает все переменные из стека, что
включает в себя t, буфер и параметры. В вашем случае вы возвращаете указатель t, таким образом
сделав копию этого в вызывающей функции.
Если вызывающая функция затем смотрит на то, на что t указывает , она обнаружит, что
он указывает на память в стеке, которая может существовать или не существовать. (Время выполнения выскочило
вне стека, но данные в стеке все еще могут быть там по стечению обстоятельств, а может и нет).
Хорошая новость в том, что она не безнадежна. Есть автоматизированные инструменты, которые могут искать
такого рода ошибки в вашем программном обеспечении и сообщать о них. Они называются статическими
инструменты анализа. Sentry является одним из таких примеров программы, которая может сообщить об этом
вид дефекта.