如何将数组作为参数传递?

时间:2010-06-22 12:36:45

标签: c++ arrays pointers

这让我发疯了:

我有功能

void gst_init(int *argc, char **argv[]);

在gstreamer api中我想用我定义的一些参数调用它,比如:

int argc = 2;
char* argv[2] = {"myvalue1", "myvalue2"};
gst_init(&argc, &argv);

此代码无法编译(我收到错误C2664):

error C2664: 'gst_init' : cannot convert parameter 2 from 'char *(*)[2]' to 'char **[]'

问题如何定义argv值以将其作为参数传递?我已经使用C ++超过5年了,但是自从......高中以来(五年多以前),我没有使用过原始阵列。

编辑:我正在使用VS2010 Express。

2 个答案:

答案 0 :(得分:4)

通常,您将按照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)在32位机器上是8,因为编译器推断出数组中的元素数量; sizeof(argv)是4,因此++ args会将指针移动到数组的末尾而不是像++ argv那样移动到下一个元素。编译器可以保护您免受此类操作的影响。

但通常你会按手册所示的方式使用它。

答案 1 :(得分:2)

尝试

int argc = 2;
char* arg1[1] = {"myvalue1"};
char* arg2[1] = {"myvalue2"};
char** argv[2] = { arg1, arg2 };
gst_init(&argc, argv);

char **argv[]char**的数组,类似于char*数组的数组。

OTOH您尝试传递的参数显示为char *(*)[2]:指向char*数组的指针。