这是一个打印Slist反向的功能。我正在保存数组中的反转值。但是当我超出递归函数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 :(得分:0)
您的数组是在函数范围内定义的,并且在离开之前一直有效。试图在外面使用它是未定义的行为。即使使用递归 - 每个函数都有arr
的本地版本(存储在堆栈的不同位置),没有级别可以访问另一个。
顺便说一句,请注意你的for循环没有做任何事情(该行有一个;
)。
答案 1 :(得分:0)
arr
数组被初始化并分配递归的每一步。在函数内部,只有元素0
被初始化,因此导致将数组的其余部分打印到UB(未定义的行为)。
答案 2 :(得分:0)
每次执行此行:
int arr[size],i=0;
您创建一个名为“arr”的 new 数组。您将值复制到这个新数组中,而不是原始数组,这就是为什么它在 if语句期间工作但是一旦获得显示整个列表的函数底部的代码就开始失败
解决方案是将“arr”传递给函数,因此函数的每次递归都在同一个数组上运行,而不是创建一个新数组。