c++ - 如何将数组作为参数传递?

标签 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。

最佳答案

通常您会按照 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 那样移动到下一个元素。编译器会保护您免受此类操作。

但通常您会按照手册建议的方式使用它。

关于c++ - 如何将数组作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093116/

相关文章:

c++ - 从 vector 中删除取消引用的元素

Php,检查对象数组中是否存在属性=值的对象

c++ - 删除指针成员变量的数组内存

c++ - googletest参数化的高级使用

c++ - 使用 OpenGL 修改图像?

c++ - Opengl 通过使用顶点缓冲对象

c++ - std::vector: vec.data() 或 &vec[0]

c++ - SDL_MapRGB,如何使用指向指针的指针获取屏幕->格式

c++ - 如何在 C++ 中打印 const char 指针

c - 带指针的结构体数组