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
的指针”。