Это почти наверняка, потому что вы не выделили место для вашей строки.
Причина, по которой myargv[1]="123";
работает, заключается в том, что вы устанавливаете указатель на указатель на строку, которая уже существует (компилятор обычно помещает это "123 "в предварительно инициализированную память, и это только загружается).Используя что-то вроде:
char *myargv[10];
strcpy (myargv[1], "anything");
, вы обычно сталкиваетесь с проблемами, потому что для указателя myargv[1]
не выделено резервное хранилище.
Вы можете простоустановить myargv[1]
непосредственно в буфер, в котором вы sprintf
-недренировали строку:
char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger);
myargv[1] = sprintf_buffer;
Или, если вы повторно используете этот буфер (чтобы значение перезаписывалось для нескольких целочисленных аргументов), используйте strdup
.
char sprintf_buffer[whatever];
sprintf (sprintf_buffer, "%d", myInteger1);
myargv[1] = strdup (sprintf_buffer);
sprintf (sprintf_buffer, "%d", myInteger2);
myargv[2] = strdup (sprintf_buffer);
И если по какой-то причине у вашей платформы нет a strdup
, вот один для вас:
char *strdup (const char *s) {
char *d = (char *)(malloc (strlen (s) + 1));
if (d != NULL)
strcpy (d,s);
return d;
}
Имейте в виду, что вы всегда должны проверять возвращаемое значение из strdup
, чтобы убедиться, что распределение памяти работало.Я оставил это здесь, поскольку он не имеет отношения к рассматриваемому вопросу.
Вы можете избежать выделения памяти с помощью нескольких буферов (при условии, что вы заранее знаете абсолютное количество буферов):
char sprintf_buffer1[whatever];
char sprintf_buffer2[whatever];
sprintf (sprintf_buffer1, "%d", myInteger1);
myargv[1] = sprintf_buffer1;
sprintf (sprintf_buffer2, "%d", myInteger2);
myargv[2] = sprintf_buffer2;