Указатель) Есть ли шанс, что (ptr + 1) уже занят? - PullRequest
1 голос
/ 28 марта 2020
char data;
char *ptr = &data;
*ptr = 3;
*(ptr+1) = 5;

Итак, я изучаю указатель, и одна вещь, которую я совершенно не понимаю.

Когда вы используете указатель в качестве массива, как узнать адрес ptr+1 или ptr+2 и т. Д. on не занята какой-то другой переменной?

Так, например, адрес ptr + 1 уже используется, и если я попытаюсь ввести в него 5, есть ли вероятность, что программа просто аварийно завершится?

Или более экстремальный пример, например, ptr + 1000?

Или компилятор гарантирует, что этого никогда не произойдет?

Ответы [ 2 ]

5 голосов
/ 28 марта 2020

Определение char data; резервирует место для одного char.

char *ptr = &data; устанавливает ptr для указания на это char.

Пробел в ptr+1 равен не зарезервировано для вашего использования, и ни стандарты C, ни стандарты C ++ не определяют, что произойдет, если вы попытаетесь его использовать.

Определение char data[3]; зарезервирует место для трех char. Тогда char *ptr = data; установит ptr для указания на первый из этих char. То есть ptr будет иметь адрес &data[0], а *ptr будет data[0].

Тогда ptr+1 будет указывать на следующее char; он будет иметь адрес &data[1], а *(ptr+1) будет data[1].

Как правило, вы должны использовать арифметику указателя c только для доступа к месту, которое, как вы знаете, зарезервировано для вашего использования. (Могут быть исключения или пояснения к этому в специальном коде, таком как код в ядре операционной системы, чтобы иметь дело с отображением памяти или кодом в специальном оборудовании. Вам не нужно рассматривать такие возможности в обычных пользовательских программах.)

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

Операционная система может препятствовать доступу к некоторым недопустимым адресам. Тем не менее, он будет препятствовать доступу к недействительным адресам либо потому, что они вообще не сопоставлены с вашей программой, либо они сопоставлены только для чтения, но вы попытались записать их (или некоторые другие комбинации, такие как попытка чтения execute- только память). Операционная система не помешает вам неправильно обращаться к адресам, которые сопоставлены и доступны вашей программе. Например, вычисление неверного значения указателя и использование его в назначении для изменения памяти может привести к изменению данных, необходимых вашей программе для других функций.

3 голосов
/ 28 марта 2020

Вы не знаете, заняты ли они другими переменными или нет.

Это неопределенное поведение, что означает, что стандарт C не определяет, что делает ваша программа. Может показаться, что он «работает», может взломать sh, может дать неправильные результаты или может сделать что-то еще.

Так что не делайте этого.

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