Приведенный ниже код копирует argc
и argv
аргументы main
в пользовательскую структуру. Копия точно такая же, как и исходные аргументы (argv
заканчивается NULL
, как в main). Этот код не обрабатывает какие-либо ненормальные события (такие как сбои malloc, прерывание сигнала и т. Д.).
Возможно, вы захотите избежать применения результата malloc
(это не требуется в C), существует много споров о том, является ли это приведение хорошим или плохим. Выбор за вами. Я больше ценю переносимость, поэтому я выбираю приведение, компиляцию со всеми включенными предупреждениями и исключаю все из них в коде (см. Комментарии к этому ответу).
#include <string.h>
#include <stdlib.h>
struct my_struct
{
int argc;
char** argv;
};
int main(int argc,char** argv)
{
int i = 0;
size_t n = 0;
struct my_struct s;
memset(&s,0,sizeof(s));
s.argc = argc;
/* alloc one more element than 'argc' to terminate 's.argv' with NULL */
s.argv = (char**)malloc((argc + 1) * sizeof(char*));
/* terminate 's.argv' with NULL exactly as 'argv' in 'main' */
s.argv[argc] = NULL;
for(i = 0; i < argc; ++i)
{
n = strlen(argv[i]) + 1;
s.argv[i] = (char*)malloc(n);
strcpy(s.argv[i],argv[i]);
}
return 0;
}
Другим вариантом копирования строк в argv
может быть использование функции strdup
, тогда вы можете заменить три строки:
n = strlen(argv[i]) + 1;
s.argv[i] = (char*)malloc(n);
strcpy(s.argv[i],argv[i]);
с
s.argv[i] = strdup(argv[i]);