Вывод этого кода C - PullRequest
       1

Вывод этого кода C

5 голосов
/ 29 июня 2011
#include<stdio.h>
int main()
{
    int i, j;
    int *pi,*pj;
    pi=&i;
    pj=&j;

    printf("pi-pj=%d\n",pi-pj);
    return 0;
}

Я пробовал этот код на разных компиляторах, но каждый раз, когда я получаю один и тот же результат, кто-нибудь может помочь мне понять, почему он такой же?

Ouput:

pi -pj = 3

Я в замешательстве, поскольку память обычно выделяется непрерывно. Итак, если, скажем, наш системный стек растет вниз, и у нас есть &i = 0xA, то адрес j(&j) = 0x6 (поскольку целые числа составляют 4 байта). Теперь, когда мы печатаем разницу между этими двумя int значениями указателя, вывод должен быть "1". Но это приходит как "3". Почему это?

1 Ответ

5 голосов
/ 29 июня 2011

Мне не удалось воспроизвести ваш опыт.С gcc в Linux x86:

[wally@lenovotower ~]$ cat t.c
#include<stdio.h>
int main()
{
    int i, j;
    int *pi,*pj;
    pi=&i;
    pj=&j;

    printf("pi-pj=%d\n",pi-pj);
    return 0;
}

[wally@lenovotower ~]$ gcc -o t t.c
[wally@lenovotower ~]$ ./t
pi-pj=1
[wally@lenovotower ~]$ 

Это означает, что i и j являются смежными.Вычитание указателя возвращает количество элементов между указателями, а не разницу адресов.Чтобы получить ваш результат, между ними должно быть два предмета.Я не могу объяснить, как это могло быть.

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