C 为什么我的程序在尝试使用递归时打印垃圾值?

C 为什么我的程序在尝试使用递归时打印垃圾值?,c,recursion,C,Recursion,我是编程新手,正在学习递归,我正在做本页的练习4 ,我试图在递归函数中的值“i”达到值“n”时打印数组的元素,但是一旦我运行程序,它就会打印垃圾值。我的问题是它为什么这样做?为什么不打印数组的值 #include <stdio.h> #include <stdlib.h> void printr(int n,int i); int main (void) { printf("NUMBER OF ELEMENTS:\n");

我是编程新手,正在学习递归,我正在做本页的练习4 ,我试图在递归函数中的值“i”达到值“n”时打印数组的元素,但是一旦我运行程序,它就会打印垃圾值。我的问题是它为什么这样做?为什么不打印数组的值

#include <stdio.h>
#include <stdlib.h>

void printr(int n,int i);

int main (void) 
{   
    printf("NUMBER OF ELEMENTS:\n");
    int n;
    scanf("%i",&n);
    printr(n,0);

}

void printr(int n,int i)
{   
    int arr[n];

    if (i == n)
{
    for (int j = 0; j < n; j++)
    {
        printf("%d",arr[j]);
        return;
    }    
}

    printf("element %d :\n",i+1);
    int e;
    //scan for input
    scanf("%d",&e);
    //populate array
    arr[i]=e;
    //do it again
    printr(n,i + 1);
}
#包括
#包括
无效打印器(整数n,整数i);
内部主(空)
{   
printf(“元素数:\n”);
int n;
scanf(“%i”和“&n”);
printr(n,0);
}
无效打印器(整数n,整数i)
{   
int-arr[n];
如果(i==n)
{
对于(int j=0;j
然后我通过将mein函数中定义的数组作为printr函数中的参数传递来解决这个问题 它成功了,但我不明白为什么我的第一次尝试没有成功

#include <stdio.h>
#include <stdlib.h>

void printr(int arr[],int n,int i);

int main (void)
{   
    printf("NUMBER OF ELEMENTS:\n");
    int n;
    scanf("%i",&n);
    int arr[n];
    printr(arr,n,0);

}

void printr(int arr[],int n,int i)
{   

    if (i == n)
    {
        for (int j = 0; j < n;j++)
        {
            printf("%d ",arr[j]);
        }
        printf("\n");
        return;   
    }

    printf("element %d :\n",i+1);
    int e;
    //scan for input
    scanf("%d",&e);
    //populate array
    arr[i] = e;
    //do it again
    printr(arr,n,i + 1);
}
#包括
#包括
无效打印器(int arr[],int n,int i);
内部主(空)
{   
printf(“元素数:\n”);
int n;
scanf(“%i”和“&n”);
int-arr[n];
printr(arr,n,0);
}
无效打印器(整数arr[],整数n,整数i)
{   
如果(i==n)
{
对于(int j=0;j

谢谢大家!

因为basic C:printr的每次调用在堆栈上都有自己的
arr
,最初未初始化。您可以在不初始化的情况下打印它。

当您打印出值时,它不会首先初始化。创建要打印的变量时,它指向内存中的某个位置。这个内存可能是由另一个程序释放的(因此它可以被抓取)。因此,它包含“垃圾”数据。处理此问题的方法是初始化您的值。

为了避免将来出现类似情况,请养成习惯,在不初始化指针时将指针设置为
NULL
,以便程序在尝试读取未初始化的值时出错。

打印前不初始化值。为什么这是递归的?这是一种倒退的做法。循环、填充,然后打印。这里的方法完全是扭曲和混乱的。每个递归调用都有自己的
intarr[n]。与从
main
传递时不同,它们是单独的数组,不是共享的。@WeatherVane啊,我只是在看第二个数组。