2014-01-10 71 views
0

这是一个打印缩进反转的功能。我将反转的值保存在一个数组中。但是当我超出递归函数if的范围时,数组值变成垃圾。但是,当我在if中打印它们时,这些都很好。告诉我这是为什么?谢谢链接列表递归和数组

void send_reverse(struct node* right,struct node* send){ 
     int arr[size],i=0; 
     if(right!=NULL){ 
      send_reverse(right->link,send); 
      cout<<"("<<right->num<<") "; 
      arr[i]=right->num; 
      cout<<arr[i]; 
      i++; 

     } 
     cout<<"YES \n"; 
     for(i=0;i<size;i++); 
      cout<<"-"<<arr[i]; 
    }//endf_ 

回答

0

你的数组是在函数作用域内定义的,直到离开它为止都是有效的。试图在外面使用它是未定义的行为。即使使用递归 - 每个函数都有本地版本arr(存储在堆栈中的不同位置),并且没有级别可以访问其他级别。顺便说一句,请注意您的for循环不会执行任何操作(在该行有一个;)。

0

arr数组初始化并分配递归的每一步。在函数内部,只有元素0被初始化,因此,导致将数组的其余部分打印到UB(未定义行为)。

0

每次执行这一行时间:

int arr[size],i=0; 

您创建一个新阵列所谓的 “改编”。你将你的值复制到这个新的数组中,而不是原来的数组中,这就是为什么它在if语句的期间工作,但是一旦到达显示整个列表的函数底部的代码就开始失败。

解决方法是将“arr”传递给函数,因此函数的每个递归都在相同的数组上运行,而不是创建新的数组。