Во-первых, переменная $HOME вполне может быть не установлена (env и простой unset) и этот случай нужно просто обрабатывать, выдавая сообщение на stderr и делая exit(EXIT_FAILURE). Вдобавок, assert() ещё и вызывает abort() из-за чего будет формироваться core файл (если он не запрещен).
Во-вторых, assert() выполняется только в дебажных сборках, а в production (при -DNDEBUG) программа либо упадёт (на strlen(NULL)), либо будет работать не корректно.
И вообще использовать getenv() я бы поостерёгся — всё-таки переменные окружения полностью под контролем пользователя. Я бы скорее взял uid пользователя и по нему определил home directory.
За strcpy/strcat надо убивать. Безопасная работа со строками предполагает, что их длина всегда известна, а раз так, то ничего не мешает воспользоваться более эффективным memcpy.
> И вообще использовать getenv() я бы поостерёгся — всё-таки переменные окружения полностью под контролем пользователя. Я бы скорее взял uid пользователя и по нему определил home directory.
смотря что ты пишешь. конкретно для этого примера - зависит от того, что это за файл к которому мы доступаемся. вообще же, если это не суидная программа, возможность контролировать ее поведение через переменные окружения - это плюс. только такие места нужно документировать.
Неправда. С точки зрения языка C это совершенно разные конструкции. В моем случае никакого указателя не объявляется. И код соответственно будет разный.