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

मैंने इस कोड को विभिन्न कंपाइलरों पर करने की कोशिश की, लेकिन हर बार मुझे एक ही परिणाम मिल रहा है, क्या कोई मुझे समझने में मदद कर सकता है कि यह वही क्यों है?इस सी कोड का आउटपुट

ouput:

pi -pj = 3 

मैं, उलझन में हूँ के रूप में स्मृति सामान्य रूप से समीपवर्ती आवंटित किये जायेंगे। तो, अगर मान लें, तो हमारा सिस्टम स्टैक नीचे बढ़ रहा है और हमारे पास &i = 0xA है, तो j(&j) = 0x6 का पता (क्योंकि पूर्णांक 4 बाइट्स हैं)। अब जब हम इन दो int पॉइंटर मानों के बीच अंतर प्रिंट कर रहे हैं, आउटपुट "1" होना चाहिए। लेकिन यह "3" के रूप में आ रहा है। ऐसा क्यों है?

+1

स्टैक ओवरफ़्लो में आपका स्वागत है! आप क्या आउटपुट प्राप्त कर रहे हैं? आपने क्या उम्मीद किया? यदि आप इस सवाल के बारे में अधिक सटीक हैं, तो हम बेहतर प्रतिक्रिया दे सकते हैं। साथ ही, क्या यह एक होमवर्क सवाल है? यदि ऐसा है, तो आपको इसे इस तरह टैग करना चाहिए। – templatetypedef

+1

विभिन्न कंपेलरों से एक ही परिणाम प्राप्त करना एक समस्या है। अरे नहीं! मेरे सभी कार्यक्रम सही ढंग से काम नहीं करते हैं। – tjm

+0

क्षमा करें, असुविधा के कारण, मैंने अपनी क्वेरी संपादित की है, समस्या विवरण पर बहस के लिए धन्यवाद। – Learner

उत्तर

5

मैं आपके अनुभव को दोहराने में सक्षम नहीं था। लिनक्स x86 पर gcc के साथ:

[[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 और j निकट हैं। पॉइंटर घटाव पॉइंटर्स के बीच वस्तुओं की संख्या देता है, पता अंतर नहीं। अपना परिणाम प्राप्त करने के लिए, बीच में दो आइटम-पैडिंग के लायक होंगे। मैं समझा नहीं सकता कि यह कैसे हो सकता है।

+1

कोई अनुकूलन रिटर्न के साथ एमएसवीसी 3: दो आइटम-पैडिंग के लायक पीआई और पीजे हैं। अनुकूलन के साथ मुझे -1 मिलता है, यानी यह I और j को दूसरी तरफ व्यवस्थित करता है। – Rup

+0

मैंने माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 पर संकलन की कोशिश की ... एन आउटपुट 3, ** @ रुप ** के रूप में आ रहा था, क्या आप मुझे बता सकते हैं कि कंपाइलर ऑप्टिमाइज़ेशन आउटपुट को कैसे बदल रहा है। – Learner

+0

मुझे लगता है कि इसे पी 1 और पी 2 स्टोर करने की आवश्यकता नहीं है - यह सिर्फ उन्हें गणना करता है और उन्हें स्मृति में कभी भी किए बिना उन्हें घटा देता है - और इसलिए उनके लिए किसी भी स्थान को ढेर पर आवंटित नहीं किया जाता है। – Rup

संबंधित मुद्दे