Причина, по которой он не использует кучу, - это соответствие стандартам (POSIX) и другим системам. Интерфейс просто не такой, что вы должны освободить возвращенный буфер. Предполагается статическое хранилище ..
Но, объявив его как локальный поток (с __thread
), два потока не конфликтуют друг с другом, если они оба вызывают функцию. Это обходной путь от glibc к нарушению интерфейса.
Это правда, что это не повторный вход или не соответствует духу этого термина. Если у вас есть рекурсивная функция, которая вызывает ее, вы не можете полагаться на одинаковый буфер между вызовами. Но он может использоваться несколькими потоками, что часто достаточно.
РЕДАКТИРОВАТЬ: Кстати, я только что вспомнил, есть более новая версия этой функции, которая использует предоставленный вызывающим буфером. См inet_ntop()
.