Арифметика отладки указателя - PullRequest
0 голосов
/ 11 февраля 2011

Я не могу решить, почему я нахожу разницу, когда я печатаю разницу между адресом переменной

Вот код:

int main()
{

        int *a,b = 5,e = 0;
        int *c,d = 10,f = 0;
        long t1,t2;
        a = &b;
        c = &d;
        e = &b;
        f = &d;
        t1 = e - f;
        t2 = a - c;
       printf("\n Address of b using a: %x \t %d using e : %x \t %d value of b : %d",a,a,e,e,b);
       printf("\n Address of d using c: %x \t %d using f : %x \t %d value of d : %d",c,c,f,f,d);
       printf("\n Value of t1 : %d",t1);
       printf("\n Value of t2 : %d \n",t2);
}

А вот вывод:

 Address of b using a: bf9e9384   -1080126588 using e : bf9e9384  -1080126588 value of b: 5

 Address of d using c: bf9e9380   -1080126592 using f : bf9e9380  -1080126592 value of d: 10


 **Value of t1 : 4
 Value of t2 : 1**

Почему существует разница между t1 и t2, когда им присваивается аналогичная разница

Пожалуйста, дайте мне знать.

Ответы [ 2 ]

8 голосов
/ 11 февраля 2011

a и c являются указателями, поэтому при учете разницы указателей возвращается число элементов между ними. e и f являются целыми числами (значения которых являются просто адресами b и d); Взятие разности целых чисел буквально просто вычитание, поэтому он возвращает число байтов .

Примечание (1): Поведение, возникающее из-за разницы двух указателей, которые не указывают на элементы одного и того же массива, равно undefined .

Примечание (2): Поведение, которое возникает в результате присвоения адреса int, определяется реализацией .

Примечание (3): Разница двух указателей имеет тип ptrdiff_t, размер которого определяется реализацией . Следовательно, присвоение этому long также определяется реализацией .

Примечание (4): Смешивать объявления указателей и не указателей в одной строке (например, int *a,b = 5,e = 0;) считается довольно плохой практикой, поскольку это невероятно запутанно!

0 голосов
/ 11 февраля 2011

Причина, по которой вы видите разные значения, заключается в том, что e-f - это int арифметика, тогда как a-c - это int* арифметика. В int* арифметике разница - это число ints, которое может быть помещено между двумя указателями, поэтому результат с 4-байтовыми значениями в 4 раза меньше.

При этом вычитание двух указателей, которые не указывают внутри одного и того же массива, называется "неопределенным поведением", и теоретически все может произойти.

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