我无法理解我是如何在输出中获得垃圾值的。有人可以解释我的流程。谢谢。
#include <stdio.h>
void rev(int *ptr){
if(*ptr) {
rev(ptr+1);
printf("%d\n",*ptr);
}
}
int main(){
int arr[]={4,2,3,1,5};
rev(arr);
return 0;
}
输出 -
32764
5
1
3
2
4
答案 0 :(得分:2)
依靠if (*ptr)
为0来阻止递归并不会很好。 C中的数组不会自动终止为零。在形式上,程序的行为是 undefined ,因为您将尝试读取超出数组末尾的内存。
处理此问题的常规方法是传递数组长度,或使用特殊值来表示数组的结尾。
答案 1 :(得分:2)
您的基本情况不正确。你递归直到在数组中找到0,但它没有。
你可能(错误地)假设在数组结束后有一个0。但是在C中不是这样。根据C标准,你的程序有undefined behaviour。
如果您需要打印整个数组,那么也要传递大小:
void rev(int *ptr, size_t size){
if(size) {
rev(ptr+1, --size);
printf("%d\n",*ptr);
}
}
int main(){
int arr[]={4,2,3,1,5};
rev(arr, sizeof arr/sizeof arr[0]);
return 0;
}