【问题标题】:why does my program print garbage values when i try using recursion?当我尝试使用递归时,为什么我的程序会打印垃圾值?
【发布时间】:2020-12-01 04:28:43
【问题描述】:

我是编程新手,我正在学习递归,我正在从这个页面做练习 4 @ 987654321@,一旦递归函数中“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);
}

然后我通过将 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[n];。与从 main 传递时不同,它们是单独的数组,不共享。
  • @WeatherVane 啊,我只看第二个。

标签: c recursion


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多