Почему strcat для getenv () изменяет последующие вызовы getenv ()? - PullRequest
0 голосов
/ 27 января 2020

Я использую getenv() в моем c коде.

Вот код, который я использую

#include<windows.h>
#include<stdio.h>

int main()

{
    char *path=getenv("USERPROFILE");
    strcat(path,"\\bullshit");
    char *newpath=getenv("USERPROFILE");
    printf("%s",newpath);
}

Результат оператора print равен

C:\Users\username\bullshit

Почему getenv() вызов переменной среды изменяется из-за strcat?

ПРИМЕЧАНИЕ: я использую 32-битный компилятор minw-g cc в windows 8.1 системе

1 Ответ

7 голосов
/ 27 января 2020

Вам не принадлежит строка, возвращаемая getenv, вы не можете ее изменить (например, добавив что-то к ней).

Если вам нужно изменить ее, скопируйте ее в память Вы владеете и можете изменять, например, массив:

char path[PATH_MAX];
strcpy(path, getenv(...));
strcat(path, ...);

Как уже отмечалось, это может привести к переполнению буфера, поэтому более безопасным может быть использование strncpy. Но помните, что есть случай, когда он не добавляет строку с нулевым терминатором, поэтому его нужно добавить явно.

...