C ++

时间:2016-08-07 16:30:10

标签: c++ pointers structure

此代码有什么问题,特别是在检查功能方面?我在根指针数组中分配了temp1的地址。但是我无法从main函数访问它,尽管它们给出了与输出相同的地址。

struct block {
  int counter=0;
  struct block *arr[4];
  bool is_leaf;
  string val[3];

} root;

void check() {
  struct block temp1;
  temp1.is_leaf=true;
  temp1.val[0]="Sy";
  root.arr[1]=&temp1;
  cout<<root.arr[1]->val[0]<<endl;
  cout<<root.arr[1]<<endl; //block address
}

int main(){

  string s1;

  root.val[2]=s1;
  struct block temp;
  temp.val[0]="wewrq";
  root.arr[0]=&temp;
  check();
  cout<<root.arr[0]->val[0]<<endl;  // did work
  cout<<root.arr[1]<<endl;          // same block address
  cout<<root.arr[1]->val[0]<<endl;  // didn't work
}

2 个答案:

答案 0 :(得分:1)

struct block temp1的生命周期在check()返回之前受到限制。 check()返回后,即使您将其地址存储在另一个全局结构实例中,也无法再访问temp1

根据您的实际使用情况,您可以将temp1声明为static struct block temp1;,或者您可能需要重新设计代码结构。

答案 1 :(得分:1)

temp1将在退出其范围时消失(在这种情况下返回函数check()),因此在main()函数之后无法访问未定义的行为< / em>的

使其可访问的一种方法是使变量像

一样静态
static struct block temp1;

这样在整个程序执行过程中只有temp1的一个实例。