2011-06-29 14 views
5
#include<stdio.h> 
int main() 
{ 
    int i, j; 
    int *pi,*pj; 
    pi=&i; 
    pj=&j; 

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

Próbowałem tego kodu na różnych kompilatorach, ale za każdym razem otrzymuję taki sam wynik, czy ktoś może mi pomóc mi zrozumieć, dlaczego to jest to samo?Wyjście tego kodu C

Ouput:

pi -pj = 3 

Jestem zdezorientowany, jak pamięć normalnie byłyby przydzielane w sposób zwarty. Tak więc, jeśli powiemy, nasz stos systemu rośnie w dół i mamy &i = 0xA, następnie adres j(&j) = 0x6 (ponieważ liczby całkowite są 4 bajty). Teraz, gdy drukujemy różnicę między tymi dwoma wartościami wskaźnika int, wyjście powinno być "1". Ale nadchodzi jako "3". Dlaczego?

+1

Witamy w Stack Overflow! Jakie wyniki osiągasz? Czego oczekiwałeś? Jeśli chcesz dokładniej określić, o co chodzi w tym pytaniu, możemy zaoferować lepszą opinię. Czy to pytanie o zadanie domowe? Jeśli tak, powinieneś oznaczyć go jako taki. – templatetypedef

+1

Uzyskiwanie tego samego wyniku z różnych kompilatorów jest problemem. Cholerny! Wszystkie moje programy nie działają wtedy poprawnie. – tjm

+0

Przepraszam, za spowodowane niedogodności, edytowałem moje zapytanie, dziękuję za kłótnie w opisie problemu. – Learner

Odpowiedz

5

Nie mogłem odtworzyć Twojego doświadczenia. Z gcc na Linux x86:

[[email protected] ~]$ 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; 
} 

[[email protected] ~]$ gcc -o t t.c 
[[email protected] ~]$ ./t 
pi-pj=1 
[[email protected] ~]$ 

Oznacza to, że i i j sąsiadują. Odejmowanie wskaźnika zwraca liczbę elementów między wskaźnikami, a nie różnicę adresu. Aby uzyskać wynik, musielibyśmy mieć dwa elementy - wartości padding pomiędzy. Nie potrafię wyjaśnić, jak to możliwe.

+1

MSVC bez optymalizacji zwraca 3: dwa elementy - wartość dopełnienia to pi i pj. Dzięki optymalizacji otrzymuję -1, tzn. Jest ona ustawiona na odwrót. – Rup

+0

Próbowałem kompilacji w Microsoft Visual Studio 2010 ... n wynik był nadchodzi jako 3, ** @ Rup **, możesz u plz, daj mi znać, jak optymalizacja kompilatora zmienia dane wyjściowe. – Learner

+0

Zakładam, że dzieje się tak dlatego, że nie trzeba przechowywać p1 i p2 - po prostu je oblicza i odejmuje bez angażowania ich w pamięć - i nie przeznacza dla nich miejsca na stosie. – Rup