2011-06-29 54 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; 
} 

Tôi đã thử mã này trên các trình biên dịch khác nhau, nhưng mỗi khi tôi nhận được kết quả tương tự, ai cũng có thể giúp tôi hiểu tại sao nó giống nhau?Đầu ra của mã C này

Ouput:

pi -pj = 3 

Tôi bối rối, như bộ nhớ thông thường sẽ được phân bổ liên tục kế nhau. Vì vậy, nếu chúng ta nói, ngăn xếp hệ thống của chúng tôi đang phát triển xuống dưới và chúng tôi có &i = 0xA, thì địa chỉ của j(&j) = 0x6 (vì số nguyên là 4 byte). Bây giờ khi chúng tôi đang in sự khác biệt giữa hai giá trị con trỏ int này, đầu ra phải là "1". Nhưng nó đang đến như "3". Tại sao vậy?

+1

Chào mừng bạn đến với Stack Overflow! Bạn nhận được kết quả gì? Những gì bạn đã mong đợi? Nếu bạn chính xác hơn về câu hỏi này, chúng tôi có thể cung cấp phản hồi tốt hơn. Ngoài ra, đây có phải là câu hỏi về bài tập về nhà không? Nếu vậy, bạn nên gắn thẻ như vậy. – templatetypedef

+1

Nhận được kết quả tương tự từ các trình biên dịch khác nhau là một vấn đề. Chỉ trích! Tất cả các chương trình của tôi không hoạt động chính xác. – tjm

+0

Xin lỗi, vì sự bất tiện gây ra, tôi đã chỉnh sửa truy vấn của mình, cảm ơn vì đã tranh luận về mô tả sự cố. – Learner

Trả lời

5

Tôi không thể tái tạo trải nghiệm của bạn. Với gcc trên 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] ~]$ 

Điều này có nghĩa rằng ij là liền kề. Trừ con trỏ trả về số lượng các mục giữa các con trỏ, không phải là sự khác biệt địa chỉ. Để có được kết quả của bạn, sẽ có hai phần đệm có giá trị ở giữa. Tôi không thể giải thích như thế nào.

+1

MSVC không có tối ưu hóa trả về 3: hai mục có giá trị là pad và pj. Với tối ưu hóa tôi nhận được -1, tức là nó được sắp xếp i và j theo cách khác. – Rup

+0

tôi đã cố gắng biên dịch trên Microsoft Visual studio 2010 ... n đầu ra là đến 3, ** @ Rup **, u có thể plz, cho tôi biết, làm thế nào tối ưu hóa trình biên dịch đang thay đổi đầu ra. – Learner

+0

Tôi cho rằng đó là vì nó không cần lưu trữ p1 và p2 - nó chỉ tính toán chúng và trừ chúng mà không bao giờ cam kết chúng vào bộ nhớ - và do đó không phân bổ bất kỳ không gian nào cho chúng trên ngăn xếp. – Rup

Các vấn đề liên quan