Рекурсия и указатели

Пишу одну рекурсивную функцию на C и решил вместо глобальной переменной, которая бы отвечала за остановку данной функции передавать в аргументе указатель на булеву переменную. Решил потренироваться на более простом примере:

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

int f(short unsigned int* q, short unsigned int N){
    if (N >= 5 || *q > 10){
            return 0;
    }
    else{
        *q = 1 + f(q, N+1);
        return *q;
    }
}

int main()
{
    short unsigned int* q;
    *q = 1;
    f(q, 1);
    printf("%u", *q);
}

Однако, программа не работает (В функции main я далее вывожу содержимое по адресу указателя, но в консоль программа ничего не выводит, а процесс завершается кодом -1073741819 (0xC0000005)). Помогите разобраться, в чём тут дело


Ответы (1 шт):

Автор решения: gbg

Проблема вот тут:

    short unsigned int* q;
    *q = 1;

Вы неверно поняли работу с указателями - память под указатель нужно сперва зарезервировать, чего вы не делаете. Отсюда неопределенное поведение и все остальные эффекты.

Исправить можно как-то так:

int main()
{
    short unsigned int q = 1;
    f(&q, 1);
    printf("%u", q);
}

Здесь важно понимать, что мы берем память на стеке под переменную q, после чего используем указатель на нее в функции.

→ Ссылка