Когда вы делаете:
char * cmd;
Вы выделяете указатель в стеке .Этот указатель не инициализируется каким-либо значимым значением.
Затем, когда вы делаете это:
strcpy(cmd, argv[0]);
Вы копируете строку, содержащуюся в argv[0]
, по адресу, указанному cmd
,что ... что-то бессмысленное.Поскольку вам повезло, это просто segfaults.
Когда вы делаете это:
cmd = "plop";
Вы присваиваете cmd
адрес статически распределенной строковой константе.Поскольку такие строки предназначены только для чтения, запись в них является неопределенным поведением.
Итак, как решить эту проблему?Выделите память для времени выполнения для записи.Есть два способа:
Первый способ - разместить данные в стеке, например:
char cmd[100]; // for instance
. Это выделяет массив из 100 char
s в стеке.Тем не менее, это не обязательно надежно, потому что вы должны знать заранее, сколько памяти вам нужно.Стек также меньше, чем куча.Что приводит нас к варианту № 2:
char *cmd = malloc(whatever_you_need); // no need to cast, by the way, unless you're in C++
Это выделяет whatever_you_need
char
s в куче.Не забудьте освободить память с помощью free
, как только закончите.