Я пытаюсь использовать putenv () в UNIX, объединяя str1 и str2 перед этим.
Я хочу добавить переменную или изменить переменную в среде, поэтому я вызываю putenv () (или я мог бы вызвать setenv () идентично).
Обычно я получаю str1 и str2, я создаю str1 = str2 и передаю его в putenv () в качестве параметра.
Код, который я показываю, работает, но когда я раскомментирую вызов free (), он этого не делает: переменная не добавляется / не изменяется для среды.
size_t size = strlen(str1) + strlen(str2) + 2; // 2 is for the '\0' and the '='
char *tmp = (char *) malloc(sizeof(char) * size);
char *p;
int pos = 0;
// Copy first word
p = str1;
while (*p != NULL) {
tmp[pos++] = *p++;
}
// Add the '='
tmp[pos++] = '=';
// Copy second word
p = str2;
while (*p != NULL) {
tmp[pos++] = *p++;
}
// Add null character
tmp[pos] = '\0';
int ret = putenv(tmp);
if (ret != 0) {
perror("putenv failed");
}
//free(tmp); // This line is the problem when not commented
Я прошу прощения за избыточность кода, я знаю, что два цикла while идентичны. Проблема, с которой я столкнулся, заключается в том, что если я раскомментирую бесплатное утверждение, а затем вызову «env» для печати окружения, putenv не добавит значение.
Я не уверен, почему это так. Прямо сейчас, чтобы это работало, у меня утечка памяти, которая мне не нравится. Когда я использовал массив, а не указатель, он вызывал ту же проблему, что и свободный комментарий.
Есть идеи?