&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
Другие вопросы по тегам