Ключевым моментом, который нужно понять, является время жизни объекта, на который вы возвращаете указатель (на самом деле, время жизни объекта - это ключевая вещь, которую нужно понимать почти во всех экземплярах объекта). Стандарт C использует терминологию «длительность хранения» для времени существования объекта, поскольку в C объект буквально является областью хранения данных, которая представляет значения.
Строковый литерал имеет «статическую продолжительность хранения», что означает (C99 6.2.4 / 3):
Его время жизни - это полное выполнение программы, а его сохраненное значение инициализируется только один раз, до запуска программы.
Так что нет проблем с возвратом указателя на строковый литерал из функции (поскольку время жизни объекта, на которое ссылается указатель, уходит). Строковый литерал объекта всегда будет допустимым объектом. Следует быть осторожным с тем, что возвращаемый указатель позволит кому-то попытаться изменить массив данных, содержащий строковый литерал, что недопустимо (это неопределенное поведение).
Локальная переменная int returnValue
в другом примере имеет «длительность автоматического хранения», что означает (C99 6.2.4 / 4):
его время жизни простирается от входа в блок, с которым он связан, до тех пор, пока выполнение этого блока не закончится каким-либо образом
(обратите внимание, что время жизни автоматического массива переменной длины немного отличается).
Таким образом, указатель на returnValue
становится недействительным в тот момент, когда возвращается функция.
Я думаю, что время жизни объекта - это одна из фундаментальных вещей, которую должен понимать каждый программист, и это особенно важно в C и C ++, поскольку программист в значительной степени отвечает за правильную обработку, особенно при работе с указателями.