В чем разница между ptr=

#pointers #malloc

#указатели #malloc

Вопрос:

Рассмотрим этот пример кода:

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

        int main(void){
        int i=0,n;
        int*ptr;                  /*this program attempts to prompt user to keep entering integer 
                                values untill he gives 9 as input */
        //ptr=amp;n;
        ptr = (int*)malloc(4);
        for(i=0;;i  )
        {
           scanf("%d",ptr i);
           if(*(ptr i)==9)
           return 0;
        }
        return 0;
        }
 

Приведенный выше код хорошо работает, предлагая пользователю продолжать вводить целые числа, пока он не введет 9.
Но если я напишу

     ptr=amp;n;
 

вместо

     ptr = (int*)malloc(4);
 

это не работает должным образом.
Пожалуйста, поясните, почему один работает, а другой нет, поскольку каждый раз ptr это указатель, хранящий адреса блоков памяти, в которых хранятся целые значения.

Ответ №1:

При ptr=amp;n; этом вы берете адрес существующей переменной.
Вы сможете получить доступ к переменной напрямую, и вы можете получить к ней доступ через указатель.

При ptr = (int*)malloc(4); этом вы берете адрес только что выделенной части памяти. Предполагая, что sizeof(int)==4 в вашей среде здесь. Вы можете получить к нему доступ только через указатель.

В обоих случаях ваш цикл, начиная со второго взаимодействия (когда >0 ) обращается к памяти, к которой вам не разрешен доступ.

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