用全局变量编程会产生错误的结果

时间:2014-01-16 19:38:08

标签: c++

我已经用其他语言编写了一段时间并且非常熟练,但是现在我更深入地学习C ++并遇到了一些我从未在其他语言中遇到的奇怪问题。谷歌搜索无法回答的最令人沮丧的是两个不同的代码订单。

背景是我有一个整数数组,一个指针是数组中的一个元素。当我去打印指针时,一个方法打印正确,另一个打印无意义。

第一个代码顺序的示例是:

#include <iostream>

using namespace std;

void main(){
    int *pAry;
    int Ary[5]={2,5,2,6,8};

    pAry=&Ary[3];

    cout<<*pAry<<endl;

    system("pause");
}

它按预期工作。然而,这个简单的顺序不适用于整个项目,因为我希望其他模块访问pAry,所以我认为全局定义应该有效,因为它适用于其他语言。这是一个例子:

#include <iostream>

using namespace std;
int *pAry;
void evaluate();

void main(){

    evaluate();
    cout<<*pAry<<endl;

    system("pause");
}

void evaluate(){
    int Ary[5]={2,5,2,6,8};
    pAry=&Ary[3];
}

当我使用第二种方法时,输出是无意义的。特别是1241908 ....当答案应该是6。

首先,我想知道为什么我的全局方法不起作用,其次我想知道如何使其工作。感谢

4 个答案:

答案 0 :(得分:8)

在第二个示例中,Ary是函数evaluate的本地。当evaluate返回时,Ary超出范围,访问它的内存区域会导致未定义的行为。

要避免这种情况,请在您尝试访问它时仍然有效的范围内声明Ary

答案 1 :(得分:4)

它不起作用,因为你的pAry指向一个本地数组,当你从evaluate()返回时会被销毁。这是未定义的行为。

一种可能的解决方法是使本地数组静态:

static int Ary[5]={2,5,2,6,8};

答案 2 :(得分:3)

evaluate()函数中,您将pAry瞄准该变量(实际数组元素) local 到该函数。只有指向的对象仍然存在,才能取消引用指针。当本地物体超出范围时,它们就不复存在;在这种情况下,这意味着当Ary结束时evalute()的所有元素都不存在,因此pAry成为悬空指针(它不指向任何有效位置)。

取消悬挂指针会给出未定义的行为; 在您的特定情况下,它会输出一个垃圾值,但它可能也会崩溃或(最糟糕的是)似乎工作正常,直到程序发生变化后面。

要解决此问题,您既可以将Ary设为全局,也可以设为static

void evaluate(){
    static int Ary[5]={2,5,2,6,8};
    pAry=&Ary[3];
}

静态局部变量在函数调用之间持续存在(它从第一次初始化到程序终止时存在),因此指针将重新生成有效。

答案 3 :(得分:1)

问题是您需要使用文件范围声明Ary

int Ary[] = {1,2,3,4,5};

void print_ary(void); // The void parameter is a style thingy. :-)

int main(void)
{
  print_ary();
  return EXIT_SUCCESS;
}

void print_ary(void)
{
  for (unsigned int i = 0; i < (sizeof(Ary) / sizeof(Ary[0]); ++i)
  {
    std::cout << Ary[i] << std::endl;
  }
}

更好的解决方案是将std::vector传递给您的函数而不是使用全局变量。