此代码有什么问题,特别是在检查功能方面?我在根指针数组中分配了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
}
答案 0 :(得分:1)
struct block temp1
的生命周期在check()
返回之前受到限制。 check()
返回后,即使您将其地址存储在另一个全局结构实例中,也无法再访问temp1
。
根据您的实际使用情况,您可以将temp1
声明为static struct block temp1;
,或者您可能需要重新设计代码结构。
答案 1 :(得分:1)
temp1
将在退出其范围时消失(在这种情况下返回函数check()
),因此在main()
函数之后无法访问未定义的行为< / em>的
使其可访问的一种方法是使变量像
一样静态static struct block temp1;
这样在整个程序执行过程中只有temp1
的一个实例。