Указатель может указывать на память, что не выделено? - PullRequest
0 голосов
/ 05 ноября 2018

Рассмотрим следующий код:

int *p;
p = malloc(1);//p can point to 1 byte memory area

Почему p может указывать на многие области памяти, как показано ниже?

printf("%p %p %p %p %p",p,p+1,p+2,p+3,p+4);

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

C не проверяет адреса памяти. Это одна из вещей, которая делает c невероятно эффективным, но и более сложным для программирования. Указатель - это просто переменная, как и любая другая, которая хранит двоичные данные и отличается только тем, что данные должны быть адресом памяти. Арифметика указателей совершенно верна в случае, например, массивов c.

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

0 голосов
/ 05 ноября 2018

Случаи p+1, p+2 и т. Д. Вызывают неопределенное поведение . Как описано на этой странице, ваша программа не соответствует правилам языка Си, поэтому любое поведение, которое вы можете получить, не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...