Экспериментально представляется, что я могу захватить последовательные значения optarg
при итерации int getopt(int argc, char * const argv[], const char *optstring)
и ссылаться на них позже, как в следующем примере программы:
// main.c
#include <stdio.h>
#include <unistd.h>
int main( int argc, char* argv[] )
{
int opt;
char o;
char* a = NULL;
char* b = NULL;
while ( -1 != ( opt = getopt( argc, argv, "abcd:e:" ) ) )
{
char o = opt & 0xFF;
switch ( o )
{
case 'a':
{
printf( "%c (%p): [%s]\n", o, optarg, (NULL == optarg ? "" : optarg ) );
break;
}
case 'b':
{
printf( "%c (%p): [%s]\n", o, optarg, (NULL == optarg ? "" : optarg ) );
break;
}
case 'c':
{
printf( "%c (%p): [%s]\n", o, optarg, (NULL == optarg ? "" : optarg ) );
break;
}
case 'd':
{
printf( "%c (%p): [%s]\n", o, optarg, (NULL == optarg ? "" : optarg ) );
a = optarg;
break;
}
case 'e':
{
printf( "%c (%p): [%s]\n", o, optarg, (NULL == optarg ? "" : optarg ) );
b = optarg;
break;
}
}
}
printf( "(%p): [%s]\n", a, (NULL == a ? "" : a ) );
printf( "(%p): [%s]\n", b, (NULL == b ? "" : b ) );
return 0;
}
Компиляция и выполнение примера:
> gcc -g main.c && ./a.out -dabc -e def -a
d (0x7fffe8d1d2b2): [abc]
e (0x7fffe8d1d2b9): [def]
a ((nil)): []
(0x7fffe8d1d2b2): [abc]
(0x7fffe8d1d2b9): [def]
Вопрос : Это действительно?Т.е. действительные значения, отличные от NULL optarg
, действительны после последовательных итераций getopt()
и / или его последней итерации (когда он возвращает -1)?Т.е. безопасно ли захватывать последовательные значения и ссылаться на них позже (т.е. без strdup
их)?Я не хочу предполагать, что мой экспериментальный код в целом корректен.
Страница руководства заявляет, что существует extern char* optarg
, но не указывает, может ли он повторно использоваться последовательными вызовамиgetopt()
.
(Поскольку аргументы getopt
равны argc
и argv
, это означает, что для optarg
установлено смещение argv
, и в этом случае я считаю, что это безопасночтобы захватить его последовательные значения, но я хотел бы узнать, если это правильное предположение).