Понимание реализации setenv () в GlibcC++

Программы на C++. Форум разработчиков
Anonymous
Понимание реализации setenv () в Glibc

Сообщение Anonymous »

Я пытался понять семантику того, что происходит в следующем случае: < /p>

Код: Выделить всё

const char* value = std::getenv("key");
setenv("key", "another_value");

read(value); // is this valid?
< /code>
Страница человека для setenv () ничего не говорит об этом случае. Тем не менее, я не могу понять, что кажется, это очень простой кусок кода в setenv () 
, который я нашел в зеркале Glibc:

Код: Выделить всё

size = 0;
if (ep != NULL)
{
for (; *ep != NULL; ++ep)
if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
break;
else
++size;
}

if (ep == NULL || __builtin_expect (*ep == NULL, 1))
{
char **new_environ;

/* We allocated this space; we can extend it.  */
new_environ = (char **) realloc (last_environ,
(size + 2) * sizeof (char *));
Здесь мы просматриваем массив CStrings, найдем name = value пара для переменной, которую мы заменяем. Затем мы называем Realloc с размером+2 . Size является либо индексом ключа, который мы обнаружили, либо индекс нулевого терминатора 2 -й шар. /> < /blockquote>
Учитывая вышеперечисленное, если мы нашли хорошее значение в цикле выше, разве вызов realloc не является плохим? Это может в конечном итоге сократить 2D массив, перезаписывая другое имя = value пары?

Подробнее здесь: https://stackoverflow.com/questions/796 ... n-in-glibc

Вернуться в «C++»