Проблема с указателем - PullRequest
       1

Проблема с указателем

3 голосов
/ 01 декабря 2010

Когда я запускаю вышеупомянутую программу в gcc complier (www.codepad.org), я получаю вывод как системный вызов Disallowed: SYS_socketcall Может кто-нибудь объяснить, почему появляется эта ошибка / вывод?я заметил, я становлюсь недоступным после того, как я выполню * ++ p = 2; ПОЧЕМУ?

Ответы [ 6 ]

5 голосов
/ 01 декабря 2010

Когда вы делаете *p = &i, вы указываете p на одно целое число i.++p увеличивает p, чтобы указывать на следующее целое число, но поскольку i не является массивом, результат не определен.

2 голосов
/ 01 декабря 2010

То, что вы наблюдаете, является неопределенным поведением. В частности, разыменование p в *++p=2 запрещено, поскольку i не является массивом, по крайней мере, с двумя членами. На практике ваша программа, скорее всего, пытается записать в любую память по адресу &i + sizeof(int).

1 голос
/ 01 декабря 2010

Выражение *++p сначала перемещает указатель p на одну точку int вперед (т. Е. Указатель становится недействительным), затем разыменовывает результирующий указатель и пытается сохранить число 2 там, таким образом записывая в недопустимую память.

Возможно, вы имели в виду *p = 2 или (*p)++.

1 голос
/ 01 декабря 2010

Вы вызываете неопределенное поведение , записывая в неопределенные области в стеке.У codepad.org есть защита от программ, которые пытаются делать запрещенные вещи, и ваша неопределенная программа поведения, похоже, сработала.

Если вы попытаетесь сделать это на своем компьютере, ваша программа, вероятно, завершится сбоемдругим способом (например, ошибка сегментации или ошибка шины).

0 голосов
/ 01 декабря 2010

Оператор ++ изменяет свой аргумент, поэтому строка *++p=2; присваивает 2 местоположение в стеке, которое, вероятно, определяет кадр вызова , а увеличивает указатель p. После того, как вы испортили кадр вызова - все ставки отключены - вы оказались в поврежденном состоянии.

0 голосов
/ 01 декабря 2010

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

Все, что ваш код имеет право делать в том виде, в котором он написан в настоящее время, - это чтение и запись из области памяти размером sizeof(int) в &i, а другой размером sizeof(int*) в &p.

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

*++p=2;

printf("\n%d",*p);
printf("\n%d",*(&i+1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...