C++ 如果我使用一个结构来携带argc和argv,我如何将地址argv分配给结构中的一个变量?

C++ 如果我使用一个结构来携带argc和argv,我如何将地址argv分配给结构中的一个变量?,c++,struct,pass-by-reference,argv,C++,Struct,Pass By Reference,Argv,我已将上述主要结构定义为: struct arguments { int c; char *v[]; }; 现在我主要想做这件事: int main(int argc, char *argv[]) { arguments arg; arg.c = argc; arg.v = argv; /* error: incompatible types in assignment of 'char** to char* [0]' */ } 因此,我并不完全理解我在

我已将上述主要结构定义为:

struct arguments
{
   int c;
   char *v[];
};
现在我主要想做这件事:

int main(int argc, char *argv[])
{
    arguments arg;

    arg.c = argc;
    arg.v = argv; /* error: incompatible types in assignment of 'char** to char* [0]' */
}
因此,我并不完全理解我在做什么,但我本能地重新设计了结构,使行
char*v[]改为
char**v[]
然而,这意味着当我通过引用传递我的结构
arg
时,如果我想取消引用并获得
arg.v[0]
的值,这将是程序名,我现在必须执行
*arg.v[0]
,这不再适用于
*arg.v[1]

我有一个功能,例如:

void argument_reader(arguments &arg)
{
   cout << "Number of arguments: " << arg.c << endl << endl;
   cout << "Array\t\tValue\n";
   cout_bar(40);
   for (int i = 0; i < arg.c; i++)
   {
      cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
   }
   return;
}
void参数\u读取器(参数和参数)
{
不能你需要写:

struct arguments
{
    int    c;
    char **v;
};
现在你的
main()
可以工作了。(这种混乱就是为什么我总是使用
intmain(intargc,char**argv)
,但这是我个人的一个怪癖。)

<>如果你在C99或更晚的时候工作,你用你的结构创建的是所谓的(FAM),是C99上的C89(因此超过C++ 98)。我没有注意到你在C++中工作。C中有FAM的特殊规则,你不能像你用灵活数组成员那样做任务。

但是,修复将在C++中工作,就像C一样,只是使用FAM不一定正确。你是使用支持FAM作为扩展的C++编译器吗? 在输出行中,您有:

cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
你需要写:

struct arguments
{
    int    c;
    char **v;
};
现在你的
main()
可以工作了。(这种混乱就是为什么我总是使用
intmain(intargc,char**argv)
,但这是我个人的一个怪癖。)

<>如果你在C99或更晚的时候工作,你用你的结构创建的是所谓的(FAM),是C99上的C89(因此超过C++ 98)。我没有注意到你在C++中工作。C中有FAM的特殊规则,你不能像你用灵活数组成员那样做任务。

但是,修复将在C++中工作,就像C一样,只是使用FAM不一定正确。你是使用支持FAM作为扩展的C++编译器吗? 在输出行中,您有:

cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
两件事:

struct arguments
{
   int c;
   char *v[]; /*unknown length, hence structure is incomplete*/
};
您需要一个双指针,它保存
argv

    struct arguments {
       int c;
       char **v;
    };
两件事:

struct arguments
{
   int c;
   char *v[]; /*unknown length, hence structure is incomplete*/
};
您需要一个双指针,它保存
argv

    struct arguments {
       int c;
       char **v;
    };

将结构更改为:

struct arguments
{
   int c;
   char **v;
};
C样式的数组和指针非常相似,您可以像您的版本或原始的
argv
参数一样使用上述结构

实际上,main函数通常是这样声明的,而不是使用[]:

int main(int argc, char **argv)

请注意,使用此应答代码
v
指向指向char的原始
argv
指针数组时,指针不会被复制。如果确实需要复制,则需要动态分配char指针数组并进行复制。

将结构更改为:

struct arguments
{
   int c;
   char **v;
};
C样式的数组和指针非常相似,您可以像您的版本或原始的
argv
参数一样使用上述结构

实际上,main函数通常是这样声明的,而不是使用[]:

int main(int argc, char **argv)

请注意,使用此答案代码
v
指向指向char的原始
argv
指针数组,指针不会被复制。如果您确实需要复制,则需要动态分配char指针数组并进行复制。

是的,让我编辑我的问题,以便更清楚地了解为什么我不理解为什么不能调用*arg.v[1]C++与C99不兼容,我们在C++中没有VLAs……有趣的是,我假设它是c99,因为fAM……fAM在C++中不工作,是吗?或者是C++ 2011中的新的?不,现在还没有C++中的AFAIK——也许它会在将来,但现在,它不在那里。也许人们会说——为什么不使用<代码> STD::vector < /c?ODE不是FAM,但是那些C++中的疯子会产生任何东西,而厨房的下沉在这里仍然是个问题,如果我把ARG传递给一个函数,比如<代码> AguMutTyRead <代码>,我怎么称呼<代码> *ARG.V[i]?
当我在
cout
中使用此选项时,我希望它打印完整的参数,而不是一个字符。是的,让我编辑我的问题,以便更清楚地了解为什么我不理解为什么我不能调用*arg.v[1]C++与C99不兼容,我们在C++中没有VLAs……有趣的是,我假设它是c99,因为fAM……fAM在C++中不工作,是吗?或者是C++ 2011中的新的?不,现在还没有C++中的AFAIK——也许它会在将来,但现在,它不在那里。也许人们会说——为什么不使用<代码> STD::vector < /c?ODE不是FAM,但是那些C++中的疯子会产生任何东西,而厨房的下沉在这里仍然是个问题,如果我把ARG传递给一个函数,比如<代码> AguMutTyRead <代码>,我怎么称呼<代码> *ARG.V[i]?
当我在
cout
中使用它时,我希望它打印完整的参数,而不是一个字符。这是有道理的,它不知道数组的长度可能是我无法调用
*arg.v[1]的原因
,谢谢,这是一个明确的答案。这很有意义,它不知道数组的长度可能就是我无法调用
*arg.v[1]
,谢谢这是一个明确的答案。请注意,在函数声明中,
char*argv[]
char**argv
具有相同的含义,并且两者的含义相同“
argv
是指向
char
的指针。请注意,在函数声明中,
char*argv[]
char**argv
具有相同的含义,两者都表示“
argv
是指向
char
的指针”。