如果我使用一个结构体来携带argc和argv,我如何将地址argv赋值给结构体中的变量?

If I use a struct to carry argc and argv, how do I assign the address argv to a variable inside the structure?

本文关键字:argv 结构体 地址 变量 赋值 argc 一个 如果      更新时间:2023-10-16

我在main上面定义了一些结构:

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

现在我想在main:

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 << "ArrayttValuen";
   cout_bar(40);
   for (int i = 0; i < arg.c; i++)
   {
      cout << "argv[" << i << "]tt" << *arg.v[i] << endl;
   }
   return;
}

但是当我调用*arg.v[i]时,程序结束时没有打印第二个参数的值或任何其他参数的值。

所以我的问题是,是否有某种方法可以使用结构体在函数之间传递,这样我就可以在另一个函数中调用arg.v[some_index < arg.c],通过某种方式使arg.v = argv在main中按我的意图工作(将argv的地址存储在arg.v中)

所有的结构所做的就是让它,而不是必须传递argcargv到一个函数,它有一个声明:void func(int &argc, char *argv[]);我可以传递我的新结构类型与变量名arg到一个函数声明像void func(arguments &arg),这基本上是所有我想要的结构。如果我不能这样做,那么我可以回到第一个方法

你需要写:

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

现在你的main()将工作。(这种混乱就是为什么我总是使用int main(int argc, char **argv),但这是个人的怪癖。)

如果你在C99或更高版本中工作,你用你的结构创建的是所谓的"灵活数组成员"(FAM),这是C99在C89(因此在c++ 98)上的一个附加项。我没注意到你在用c++工作!在C语言中有一些关于FAM的特殊规则,您不能像对灵活数组成员那样执行赋值操作。

然而,这个修复在c++中和在C中一样有效;使用FAM不一定是正确的。您是否使用支持FAM作为扩展的c++编译器?

在你的输出行,你有:

cout << "argv[" << i << "]tt" << *arg.v[i] << endl;

输出实参的第一个字符;去掉*,你会得到第一个参数作为字符串:

cout << "argv[" << i << "]tt" << arg.v[i] << endl;

把你的struct改成this:

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[]; /*unknown length, hence structure is incomplete*/
};

需要一个双指针,它保存着argv

的地址。
    struct arguments {
       int c;
       char **v;
    };