Разность адресов между двумя целочисленными переменными в c - PullRequest
2 голосов
/ 03 сентября 2011
#include<stdio.h> 
int main()
{
    int i=10,j=20,diff;
    diff=&j-&i;
    printf("\nAddress of i=%u Address of j=%u",&i,&j);
    printf("\nDifference of address i and j is %d\n",diff);
    return 0;
}

Вывод, который я получил:

Address of i=3012788 Address of j=3012776
Difference of address i and j is -3

Но разница между адресами здесь составляет 2.

Когда я делаю diff=&i-&j, я получаю следующий вывод:

Address of i=2751740 Address of j=2751728
Difference of address i and j is 3

Но разница здесь между адресами составляет 12.

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

Ответы [ 5 ]

8 голосов
/ 03 сентября 2011

Прежде всего, арифметика с адресами, не принадлежащими к одному и тому же блоку памяти, не разрешена (массив и т. Д.).

Твой второй вопрос интереснее. Вы вычитаете два адреса, и это не поддается арифметике. Вот что происходит.

Вот как работает арифметика указателей:

  • pointer + x фактически означает pointer + sizeof *pointer
  • pointer1 - pointer2 фактически означает (pointer1 - pointer2) / sizeof *either

То есть вы ожидаете 12 и получаете 3 = 12 / 4. Это потому, что int на вашей платформе имеет длину 4 байта.

3 голосов
/ 03 сентября 2011

Вы пробовали:

    diff=(int)&j-(int)&i;
3 голосов
/ 03 сентября 2011

Вычисление разницы между указателями, которые не указывают на один и тот же массив (как в вашем случае), является неопределенным поведением в C. См. this для получения дополнительной информации и ссылок.

2 голосов
/ 03 сентября 2011

Когда объявляются 2 целочисленные переменные, необязательно, чтобы вторая переменная занимала следующие четыре байта адреса, занятого первой переменной?

NO, адрес может быть где угодно, выбирает компилятор, если, конечно, у вас нет массива.

1 голос
/ 03 сентября 2011

Вы используете арифметику указателя.Поскольку int составляет 4 байта на вашей машине, результат * 4 - это расстояние между двумя адресами.Однако вы можете применить преобразование, например (int), к указателям, чтобы получить то, что вы ожидали.

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