使用C中的递归打印整数数组的反转

时间:2016-10-03 11:16:11

标签: c recursion

我无法理解我是如何在输出中获得垃圾值的。有人可以解释我的流程。谢谢。

#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     

2 个答案:

答案 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;
}