При написании небольших утилит UNIX на C я иногда хочу взять копию argv
, предоставленную main(), чтобы я мог настроить параметры перед вызовом exec(). Ниже основывается на свободно реализации из xargs BSD (1):Есть ли простой способ скопировать argv в C?
void run_script(char *argv[]) {
char **tmp, **new_argv;
int argc;
for (argc=0; argv[argc] != 0; argc++);
new_argv = malloc((argc + 1) * sizeof(char *));
for (tmp=new_argv; *argv != 0; tmp++) {
*tmp = *argv++;
*tmp = strdup(*tmp);
}
/* call execvp(3) using new_argv */
for (i=0; i<=argc; i++)
free(new_argv[i]);
free(new_argv);
}
Это чувствует себя более сложным, чем это должно быть. Есть ли лучший способ написать это в C? (Возможно заполнение одного буфера, который был выделен с помощью _POSIX_ARG_MAX.)
почему вы не передавая 'argc' из' функции main', слишком? так или иначе, потому что вы не можете надежно и безопасно определить размер массива с помощью указателя 'argv [argc]! = 0' означает, что вы определяете размер массива, явно просматривая память, которая выходит за пределы, надеясь, что это будет '0', почему бы просто не передать' argv' и назначить его локальному указателю, например GTK +? –
@EliasVanOotegem: стандарт C гарантирует, что массив 'argv', переданный в' main', заканчивается нулевым указателем (и который вы можете проверить для этого нулевого указателя), поэтому здесь нет доступа к границам , –
@BartvanIngenSchenau: Приятно знать ... в этом случае: 'argv [argc]! = 0' должно быть' argv [argc] ', никакого сравнения, чтобы оно не было' argv [argc]! = NULL' –