i
का पता main()
में कभी भी परिवर्तित नहीं होगा, लेकिन इसमें निहित मूल्य होगा। आप स्थानीय चर का संदर्भ ले रहे हैं और उस संदर्भ के बाद इसका उपयोग दायरे से बाहर हो गए हैं। (इंप्रेशन भाषा चेतावनी) मूल्य 6
स्टैक पर है। चूंकि आपने 6
डालने के बाद स्टैक के साथ कुछ भी नहीं किया है, इसके संदर्भ में अभी भी वही मान होगा। तो, जैसा कि अन्य ने कहा है, आप भाग्यशाली हो गए हैं।
देखने के लिए कितना भाग्यशाली, इस कोड को जो ढेर का उपयोग करता है के बाद आप foo()
फोन चलाने की कोशिश:
#include <iostream>
#include <ctime>
#include <numeric>
int& foo()
{
int i = 6;
std::cout << &i << " = " << i << std::endl; //Prints the address of i before return
return i;
}
long post_foo(int f)
{
srand((unsigned)time(0));
long vals[10] = {0};
size_t num_vals = sizeof(vals)/sizeof(vals[0]);
for(size_t i = 0; i < num_vals; ++i)
{
int r = (rand()%2)+1;
vals[i] = (i+f)*r;
}
long accum = std::accumulate(vals, &vals[num_vals], 0);
return accum * 2;
}
int main()
{
int &i = foo();
// std::cout << "post_foo() = " << post_foo(i) << std::endl;
std::cout << &i << " = " << i << std::endl;
}
जब मैं post_foo()
कॉल पर टिप्पणी के साथ इस भाग गया, 6
ढेर और उत्पादन पर अभी भी था था:
002CF6C8 = 6
002CF6C8 = 6
... लेकिन जब मैं post_foo()
करने के लिए कॉल अन-टिप्पणी की है और इसे फिर से भाग गया, 6
लंबे चला गया था:
001FFD38 = 6
post_foo() = 310
001FFD38 = 258923464
स्रोत
2010-04-30 14:24:02
आप बस भाग्यशाली हैं। ऐसा मत करो –
आपको यह उपयोगी मिल सकता है: http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – letsc
मेरा मानना है कि कुछ भाग्य इस तथ्य में है कि मैं foo() में unaltered (जो कंपेलरों को पाठ में स्थानांतरित करने या कहीं भी लंबे समय तक रहने की अनुमति देता है) – mho