#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
) обращается к памяти, к которой вам не разрешен доступ.
Если вы заметили разницу, например, то, что код, похоже, работает со второй версией, но не с первой, то объяснение заключается в том, что вам повезло или не повезло, в зависимости от вашей философии в отношении того, как и когда вы хотите замечать ошибки.