Обычно вы должны следовать инструкциям в manual и передавать указатели на аргументы, предоставленные main
, чтобы gstreamer мог удалить аргументы, которые он обрабатывает.
#include <stdio.h>
#include <gst/gst.h>
int main (int argc, char *argv[])
{
gst_init (&argc, &argv);
// handle the remaining argc values of argv
Если вы хотите создать свои собственные аргументы, а затем создать такой же массив, который main
бы иметь:
void gst_init(int *argc, char **argv[])
{
// strip one argument
--*argc;
++*argv;
}
void foo()
{
int argc = 2;
char* args[] = {"myvalue1", "myvalue2"};
char** argv = args;
for(int i= 0; i < argc; ++i)
printf("%s\n", argv[i]);
gst_init(&argc, &argv);
for(int i= 0; i < argc; ++i)
printf("%s\n", argv[i]);
}
Если вы не используете C99, это легче иметь отдельный указатель к локальному массиву строковых литералов. Используя C99, вы можете просто написать char** argv = (char*[]){"myvalue1", "myvalue2"};
, чтобы начать с указателя на первый элемент в анонимном массиве.
Вам нужно передать указатель на переменную, указывающую на массив, а не на указатель на первый элемент массива; в первом случае деградация параметра массива указателю достигает того же эффекта, что и второй случай, объявляющий локальную переменную указателя - тогда вы можете передать адрес этой переменной, и функция может ее изменить. sizeof (args) - 8 на 32-битной машине, поскольку компилятор выводит количество элементов в массиве; sizeof (argv) - 4, поэтому ++ args переместит указатель в конец массива, а не в следующий элемент, как это делает ++ argv. Компилятор защищает вас от такой операции.
Но обычно вы должны использовать его так, как это предлагает руководство.
не работает: 'ошибка C2440: 'initializing': не может преобразовать из 'const char [9]' в 'char **'' – utnapistim
@utnapistim, см. Мое обновление. –
Обновленный код компилируется ОК. Я пройду через это. Благодарю. – utnapistim