繁体   English   中英

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

[英]why does my program print garbage values when i try using recursion?

我是编程新手,我正在学习递归,我正在从这个页面https://www.w3resource.com/c-programming-exercises/recursion/index.php做练习 4,我正在尝试打印一旦递归 function 中的“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);
}

然后我通过在 printr function 中传递 mein function 作为参数中定义的数组来解决它,但我不明白为什么我的第一次尝试没有?

#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);
}

谢谢!

因为基本的 C:每次调用printr在堆栈上都有自己的arr ,最初未初始化。 你打印它而不先初始化它。

当您打印出该值时,它不会首先被初始化。 创建要打印的变量时,它指向 memory 中的一个位置。 这个 memory 可能被另一个程序释放了(所以它可以抢夺)。 因此,它包含“垃圾”数据。 处理这个问题的方法是初始化你的值。
为了避免将来发生此类事情,请养成在不初始化它们时将指针设置为NULL的习惯,这样当您尝试读取未初始化的值时程序会出现段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM