Как работает арифметика указателя c - PullRequest
0 голосов
/ 22 марта 2020
int a=10;
int *pa;
pa=&a;

int b=5;
*pa++=b++;

printf("%d %d", *pa,b);

Это дает вывод: 6 6

, тогда как следующий фрагмент кода:

int a=10;
int *pa;
pa=&a;

int b=5;
*pa++=b++;

printf("%d %d", a,b);

дает вывод: 5 6

почему это так, хотя pa хранит адрес a?

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Значением выражения pa++ является значение pa, но это выражение имеет побочный эффект увеличения сохраненного значения pa на один элемент.

После этого с помощью *pa не определяется стандартом C: pa больше не указывает на a, поскольку pa было изменено. В эксперименте, который вы пробовали, похоже, что *pa получило значение b, как если бы компилятор поместил b в память сразу после a и позволил *pa извлечь b из памяти. Это поведение не определяется стандартом C, и вы не можете полагаться на него по нескольким причинам:

  • Компилятор может не поместить b после a в память, особенно если оптимизация
  • В некоторых реализациях C и / или некоторых обстоятельствах использование *pa после изменения pa так, чтобы оно указывало на исходный объект, может вызвать ошибку доступа к памяти.
  • При оптимизации компилятор может, в действительности, признать, что pa был изменен, чтобы иметь границы, и что *pa не определен стандартом C, и это может привести к тому, что компилятор преобразует программу в произвольный пути.
1 голос
/ 22 марта 2020

Ваш код вызывает неопределенное поведение.

Па изначально указывает на. Ваш код увеличивает pa на 1, что означает, что он указывает на переменную a. Мы можем игнорировать все, что вы делали, потому что вы пытаетесь напечатать * pa, которая считывает данные из памяти после переменной a, что является неопределенным поведением.

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

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