C++中如何对全局变量进行操作

how to operate on global variables in c++

我需要有关 C++ 中全局变量的帮助。我将一个空的 argv 数组传递给一个解析函数,我试图填充它,但是当我在 main 中访问 argv 时,无论我输入什么,argv[0] 都会返回空的。请帮忙。

static int argc;
static char* argv[100];

void parse(string str, int argc, char* argv[])
{
    argc = 0;
    char * cstr = new char [str.length()+1];
    strcpy (cstr, str.c_str());
    char * p = strtok (cstr," ");
    int i = 0;
    while (p!=0)
        {
            argc++;
            argv[i] = p;
            p = strtok(NULL," ");
            i++;
        }
    delete[] cstr;
}

int main( void ) 
{
    string theLine;

    while (true) 
        {
            cout << "myshell> ";
            getline(cin,theLine);
            cout << "Command was: " << theLine << endl;
            if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
                exit(0); 

            parse(theLine, argc, argv);
            cout << "argv[0] " << argv[0] << "\n";

        }   
}

我试图在解析器函数内将字符串分配给 argv,但是当我在 MAIN 中访问它时,它是空白的。我如何实现我想要做的事情?它与全局变量有关,但我不知道如何。

问题是您在 argv 中将指针存储到 cstr,但随后您在 parse() 函数的末尾删除了 cstr。摆脱:

delete[] cstr;

此外,您应该通过引用传递 argc。否则,当您在 parse() 函数中更新它时,它不会更新调用者的变量。所以应该是:

void parse(string str, int &argc, char *argv[])

但是,你也有内存泄漏。每次调用 parse 时,您都会创建一个新的 cstr,但绝不会删除它。您应该将函数更改为 return cstr,并让调用者在完成该解析行后将其删除。

char *parse(str str, int &argv, char *argv[]) {
    ...
    return cstr;
}

然后在你的 main() 循环中,执行:

int main( void ) 
{
    string theLine;

    while (true) 
        {
            cout << "myshell> ";
            getline(cin,theLine);
            cout << "Command was: " << theLine << endl;
            if ((theLine == "exit") || (cin.eof()) || (theLine == "quit"))
                exit(0); 

            char *cstr = parse(theLine, argc, argv);
            cout << "argv[0] " << argv[0] << "\n";
            delete[] cstr;
        }   
}

您对同名的全局变量和局部变量如何交互感到困惑。 首先让我说有两个不同的对象,每个对象都名为 argc 和两个不同的对象,每个对象都名为 argv.

第一组是全局变量

static int argc;
static char* argv[100];

第二组是你的parse函数

的参数
void parse(string str, int argc, char* argv[])
{
    argc = 0;
    ...
}

我从 parse 中提取了一行。这样做实际上是将argc参数中的对象设置为0。全局argc中的对象是not设置为0。

让我们重命名上面片段中的一些变量,以清楚地看到哪个名称属于哪个 object/place:

static int global_argc;
static char* global_argv[100];

void parse(string str, int argc, char* argv[])
{
    argc = 0;
    ...
}

现在,请注意我是如何将前两个更改为 global_,但其余的(所有的,甚至未显示的)仍然是 argcargv

您需要从了解变量作用域开始。一旦涉及到数组和指针,比如argv,事情就变得更加复杂了。我不可能在一个答案中向您解释所有这些,除了:首先了解有关变量和变量范围的更多信息。然后学习指针和数组。然后回到这个程序,看看你能不能修复它,这不是你现在能做的。 这可能需要更多的时间和更多的工作,但不要气馁。