2013-10-11 2 views
6

ठीक है, तो सी पास-बाय-वैल्यू है, जिसका अर्थ है चर के लिए मूल चर के बजाय चर की एक प्रति का उपयोग किया जाता है, है ना? तो, क्या उस प्रतिलिपि में हमेशा एक ही स्मृति पता होगा? इस कोड पर विचार करें:क्या सी में फ़ंक्शन पैरामीटर में हमेशा एक ही स्मृति पता होता है?

void test(int *ptr) { 
    printf("&ptr: %p\n", &ptr); 
    printf("ptr: %p\n", ptr); 
    printf("*ptr: %d\n\n", *ptr); 
} 

int main() { 
    int a = 1, b = 2, c = 3, d = 4, e = 5; 
    test(&a); 
    test(&b); 
    test(&c); 
    test(&d); 
    test(&e); 

    return 0; 
} 

उत्पादन मैं इस कोड से मिलता है यह है:

&ptr: 0x7fff70536728 
ptr: 0x7fff7053674c 
*ptr: 1 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536750 
*ptr: 2 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536754 
*ptr: 3 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536758 
*ptr: 4 

&ptr: 0x7fff70536728 
ptr: 0x7fff7053675c 
*ptr: 5 

मेरे पेट महसूस कर रही थी "नहीं"। यह मेरी समझ है कि ptrtest() के कोड ब्लॉक के बाहर मौजूद नहीं है। तो, सभी पांच फ़ंक्शन कॉल के लिए &ptr क्यों समान है?

+4

यह वही होने की गारंटी नहीं है। आप अनिर्दिष्ट व्यवहार देख रहे हैं। (यदि आप मुख्य के अलावा किसी अन्य फ़ंक्शन से इसे कॉल करते हैं तो आप एड्रेस चेंज देख सकते हैं।) –

+0

और यह हस्तक्षेप करने वाली फ़ंक्शन कॉल के बिना भी इस व्यवहार को प्रदर्शित नहीं कर सकता है। किसी विशेष मशीन पर कार्यान्वयन के आधार पर। –

+0

@Andyzmith भी इस पर निर्भर करता है कि संकलक इसे कैसे कार्यान्वित करने का निर्णय लेता है। :) – jmstoker

उत्तर

6

&ptr समान है क्योंकि ptrtest() के भीतर एक स्थानीय चर है। चूंकि आप किसी भी हस्तक्षेप के बिना उत्तराधिकार में test() पर कॉल कर रहे हैं, इसलिए इसे हर बार स्टैक पर एक ही पता दिया जा रहा है (नोट, यह किसी भी तरह से सी द्वारा आवश्यक नहीं है - यह आपकी मशीन है यह कर रहा है, और यह आमतौर पर कैसे होगा)।

आप एक दूसरे समारोह जो तब ही test() कहा जाता है कहा जाता है, तो आप एक ही उत्पादन &ptr के लिए मिलेगा, ढेर, जिसमें ptr पहले से रह रहा था अब हस्तक्षेप समारोह कॉल द्वारा किया जा रहा है पर है कि अंतरिक्ष के बाद से।

उदाहरण के लिए:

#include <stdio.h> 

void test(int *ptr) { 
    printf("&ptr: %p\n", (void *) &ptr); 
    printf("ptr: %p\n", (void *) ptr); 
    printf("*ptr: %d\n\n", *ptr); 
} 

void test_test(void) { 
    int a = 1; 
    test(&a); 
} 

int main() { 
    int a = 1, b = 2, c = 3, d = 4, e = 5; 

    test(&a); 
    test(&b); 
    test(&c); 
    test(&d); 
    test(&e); 
    test_test(); 

    return 0; 
} 

पैदावार:

[email protected]:~/src/c/scratch$ ./ptrtest 
&ptr: 0x7fff39f79068 
ptr: 0x7fff39f7909c 
*ptr: 1 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79098 
*ptr: 2 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79094 
*ptr: 3 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79090 
*ptr: 4 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f7908c 
*ptr: 5 

&ptr: 0x7fff39f79048 
ptr: 0x7fff39f7906c 
*ptr: 1 

[email protected]:~/src/c/scratch$ 

और आप देख सकते हैं कि &ptr आखिरी कॉल, जो test_test() के माध्यम से किया जाता है पर अलग है।

+0

आह ठीक है, अब समझ में आता है। धन्यवाद! – instagatorTheCheese

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