&q - &p, q и p указывают на неинициализированный массив символов. А о/п равно 1. Как?
main(){
char a[20],*p,*q;
p=&a[0];
q=&a[10];
printf ("%d\n",&q - &p) }
Эта программа C дает o/p как:
1
Насколько я понимаю, значения, хранящиеся по этим адресам, — мусор. Как их вычитание может быть 1?
Кто-нибудь может объяснить, как?
2 ответа
и являются двумя разными переменными-указателями. Это не два разных элемента одного и того же массива (указателей). Следовательно
&q
а также
&p
- это два указателя (на указатели), которые не указывают на элементы одного и того же массива (ни на один из его конца). Следовательно, оценка вызывает поведение undefined , и невозможно использовать определение языка, чтобы рассуждать о том, что может или не может произойти после этой точки.
См. также Допустимо ли вычитание указателей, не указывающих на разные элементы одного и того же массива, в C?.
Что может происходить в вашей программе, так это то, что она распределена по соседним адресам в стеке с более высоким адресом, чем , и что компилятор реализует
&q - &p
путем вычитания их фактических адресов и деления на их размер. Это соответствовало бы значению 1. Но компилятор никоим образом не обязан это делать; в принципе, вместо этого он мог бы напечатать
47
или же
BUG
или удалить все свои файлы.
Обратите внимание на то, что
q
а также
p
сами указывают на это совершенно не имеет значения; массив не имеет ничего общего с вашим кодом в его нынешнем виде.
Возможно, вы думали сделать
q-p
вместо. Это будет вычитание указателей на два разных элемента
a
множество. Это совершенно точно определено, и результатом будет 10.
(Кстати, результат вычитания двух указателей имеет тип
ptrdiff_t
. Вы используете спецификатор printf
%x
который действителен только для аргумента типа
unsigned
; это также вызывает неопределенное поведение. Правильный спецификатор формата будет
%td
.)
Этот звонок
printf ("%x\n",&q - &p);
имеют неопределенное поведение, поскольку выражения указателя и не указывают на элементы одного и того же массива. Это выражение
&p
имеет тип и указывает на переменную
p
в то время как выражение
&q
имеющий тот же тип
char **
указывает на переменную
q
.
Кажется, ты имеешь в виду
printf ("%tx\n",q - p);
В этом случае на выходе будет шестнадцатеричное значение 10.
a
.
Или если вы напишете
printf ("%#tx\n",q - p);
тогда вывод будет
0xa