Почему указателю присваивается мусор в строке "*range = array", а не адрес указателя array?

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

int proper(int **proper, int mini, int maxi)
{
    int *array;
    int dlin;
    int i;
    int *g;

    i = 0;
    dlin = -mini + maxi;
    if (mini >= maxi)
    {
        array = NULL;
    }
    else
    {
    array = (int*)malloc(dlin * sizeof(int));
    }
    while (i < dlin)
    {
        array[i] = mini;
        i++;
        mini++;
    }
    *proper = array;
    return i;
}

int main()
{
    int w[14] = {21, 14, 20};
    int *k = w;
    int o = 0;
    int g = 0;
        printf("%i\n", proper(k, 0, 15));
        while (o <= 2)
        {
            printf("%i\n", f[o]);
            o++;
        }
}

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

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

Меня не интересует, что происходит дальше с r. Я не понимаю поведение указателей в данной ситуации

Тогда почему вы утверждаете, что ничего не записывается? :) Сейчас вы записываете указатель, преобразуя его в int, по адресу, хранящемуся в r, т.е. в массив f.

Убедиться в этом можно, вставив вывод адреса

}
printf("%p\n",array);
*range = array;

и выводя f в шестнадцатеричном виде:

while (c <= 2)
{
    printf("%0x\n", f[c]);
    c++;
}

У меня в 64-разрядном варианте этот код дает

000001E24150CAE0
42
4150cae0
1e2
3

Как видите, совпадение адреса и содержимого первых двух элементов f полное.

Еще раз и очень медленно:

Вас не смущает, что вы должны передать в функцию int**, а передаете int*?

Подумайте над этим хорошенько... Намек, как поступать верно - даже если это вас не интересует - там же, в моем первом комментарии.

→ Ссылка