1

我有以下示例代码。只是想知道在全局指针中获取局部变量的地址然后在子函数中修改它的内容是否有效。以下程序正确修改变量a 的值。这种做法会引起任何问题吗?

#include <iostream>
#include <vector>

using namespace std;

vector<int*> va;

void func()
{
   int b ;
   b = 10;
   int * c = va[0];
   cout << "VALUE OF C=" << *c << endl;
   *c = 20;
   cout << "VALUE OF C=" << *c << endl;


}
int main()
{
     int a; 
     a = 1;
     va.push_back(&a);

     func();

     cout << "VALUE IS= " << a << endl;

     return 0;
}
4

3 回答 3

2

这没关系,只要您在超出范围va[0]后不尝试取消引用。a你没有,所以从技术上讲,这段代码很好。

也就是说,整个方法可能不是一个好主意,因为它使代码很难维护。

于 2012-12-16T13:05:11.217 回答
0

只要您func()在范围内调用,您的代码就完全有效a但是,这不被认为是一种好的做法。考虑

struct HugeStruct {
  int a;
};

std::vector<HugeStruct*> va;

void print_va()
{
  for (size_t i = 0; i < va.size(); i++)
    std::cout<<va[i].a<<' ';
  std::cout<<std:endl;
}

int main()
{
  for (int i = 0; i < 4; i++) {
    HugeStruct hs = {i};
    va.push_back(&hs);
  }

  print_va(); // oups ...
}

上面的代码有两个问题。

  1. 除非绝对必要,否则不要使用全局变量。全局变量违反封装,可能导致变量名重叠。在大多数情况下,在需要时将它们传递给函数要容易得多。
  2. 这段代码中的指针向量看起来很糟糕。正如你所看到的,我忘记了当我离开 for 循环时指针变得无效,并且print_va只是打印出垃圾。简单的解决方案可能是将对象存储在向量而不是指针中。但是,如果我不想HugeStruct一次又一次地复制对象怎么办?这可能需要相当长的时间。(假设int我们有一个百万整数的向量而不是一个。)解决方案之一是动态分配HugeStructs 并使用智能指针向量:std::vector<std::shared_ptr<HugeStruct>>。这样您就不必担心内存管理和范围。一旦没有人提及对象,对象就会被销毁。
于 2012-12-16T13:36:01.770 回答
0

我想说的是,如果您的程序增长,您可能会忘记您在某些功能中所做的更改并得到一些您没有预料到的奇怪错误。

于 2012-12-16T13:07:06.550 回答