почему моя программа печатает значения мусора, когда я пытаюсь использовать рекурсию?

#c #recursion

#c #рекурсия

Вопрос:

я новичок в программировании и изучаю рекурсию, я выполняю упражнение 4 с этой страницы https://www.w3resource.com/c-programming-exercises/recursion/index.php , я пытаюсь напечатать элементы массива, как только значение «i» в рекурсивной функции достигает значения «n», однако, как только я запускаю программу, она печатаетзначения мусора, которые я think.my вопрос в том, почему он это делает? почему он не печатает значения массива?

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

void printr(int n,int i);

int main (void) 
{   
    printf("NUMBER OF ELEMENTS:n");
    int n;
    scanf("%i",amp;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",amp;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",amp;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",amp;e);
    //populate array
    arr[i] = e;
    //do it again
    printr(arr,n,i   1);
}
 

Спасибо!

Комментарии:

1. Вы не инициализируете значения перед печатью. Почему это вообще рекурсивно? Это обратный способ сделать это. Цикл, заполнение, затем печать. Подход, который у вас здесь, совершенно извращен и запутан.

2. 🔎🐞 Запускал ли ваш код в отладчике , чтобы увидеть, где возникает эта ошибка, затем запускал его снова с точкой останова рядом с этим сбоем, чтобы вы могли осторожно продвигаться вперед и наблюдать, что происходит до этой точки?

3. У каждого рекурсивного вызова есть свои собственные int arr[n]; . В отличие от того, что передается из main , они являются отдельными массивами, а не общими.

4. @WeatherVane Ах, я смотрел только на второе.

Ответ №1:

Потому что базовый C: каждый вызов printr имеет свой собственный arr в стеке, изначально неинициализированный. И вы печатаете его, не инициализируя его сначала.

Ответ №2:

Когда вы распечатываете значение, оно не инициализируется первым. Когда вы создаете переменную для печати, она указывает на место в памяти. Вероятно, эта память была освобождена другой программой (так что ее можно использовать). Как таковой, он содержит «мусорные» данные. Способ справиться с этим — инициализировать ваши значения.
Чтобы избежать подобных вещей в будущем, заведите привычку устанавливать свои указатели на NULL то, когда вы их не инициализируете, чтобы ваши программы прерывались при попытке прочитать неинициализированное значение.