Обычно вы должны следовать инструкциям руководства и передавать указатели на аргументы, предоставленные 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. Компилятор защищает вас от такой операции.
Но обычно вы используете его так, как предлагает руководство.