Ваше наблюдение верно. Новая строка, которую вы выделили с помощью malloc
, заменяет старую строку, и старая строка больше не используется. Если старая строка является частью среды, переданной при запуске программы (, т. е. это первый раз, когда переменная изменяется в этом процессе ), то старая строка является частью сегмента стека.
Является ли это утечкой памяти или нет, спорный вопрос. Вы не можете освободить память, занятую старой строкой, но и нет разумного способа повторно использовать эту память. Если вы вызовете putenv
несколько раз, вы, конечно, можете free
выделить память, которую вы выделили себе, когда строки больше не используются.
Обратите внимание, что семантика putenv
зависит от версии glibc, как описано на странице руководства .
Кстати, в вашей программе ошибка, а не
strcat(temp, "");
strcat(temp, "PWD=/home/mycomputer/");
вы должны написать
strcpy(temp, "PWD=/home/mycomputer/");