Указатель, возвращаемый getenv, не должен храниться, так как будущие вызовы getenv могут изменить его (или вызовы setenv и т. Д.).Я пытаюсь написать вспомогательную оболочку для getenv, которая возвращает значение по умолчанию, если переменная окружения не найдена.Я бы предпочел не пропускать память.
Опции, о которых я думал:
Пусть функция-обертка скопирует строку, возвращаемую getenv, используя malloc и strcpy или strdup (это в POSIX-совместимой системе).Это работает и позволяет обрабатывать ошибки, но требует, чтобы вызывающая сторона помнила, чтобы освободить указатель.Это создает пространство для утечки памяти.
Не пытайтесь кэшировать значение, пусть каждый вызывающий объект делает это.Это позволяет легко оставить условие гонки. Используйте глобальную переменную для хранения копии строки, возвращаемой getenv.Это избавило бы от необходимости вызывать вызовы для освобождения памяти вызывающими программами, но могло бы привести к возникновению состояния гонки, как и в случае с getenv, если только я не добавлю какие-либо блокировки / атомарные обновления.
Используйте статическую переменную в функции для кэширования значения.Это, вероятно, лучший вариант, так как он повторно использует память для последующих вызовов, но может привести к условиям гонки.
Я вполне уверен, что что-то упустил.