2010-10-14 16 views
7

समझने की कोशिश कर रहा है कि सूचक वास्तव में क्या काम करता है? क्या यह कोड सेगमेंट में पता है जहां फ़ंक्शन रहता है?फ़ंक्शन पॉइंटर का पॉइंटर मान क्या दर्शाता है?

पूर्व के लिए: कोड के इस टुकड़े:

#include <stdio.h> 

void foo(void) 
{ 
} 

int main(void) 
{ 
    int a = 10; 
    printf("a's address: %p\n", &a); 
    printf("foo's address: %p\n", foo); 
    return 0; 
} 

... प्रिंट इस:

[sh/prog-exercises/adam]:./a.out 
a's address: 0xbfffb414 
foo's address: 0x8048430 

मुझे लगता है कि मैं एक छोटे से कैसे वास्तव में ढेर के साथ उलझन में हूँ/एक प्रक्रिया के ढेर के साथ संबंधित है ईएलएफ डेटा सेगमेंट/कोड सेगमेंट। कोई सहायक पॉइंटर्स वास्तव में स्वागत किया जाएगा। इसके अलावा, मेरा पहला सवाल है, तो कृपया नम्र रहो, वास्तव में सीखने की कोशिश कर रहा हूं। धन्यवाद!

उत्तर

5

यह फ़ंक्शन एंट्री पॉइंट का पता है - इसके कोड की शुरुआत। a वैरिएबल स्टैक पर स्थित है, इसलिए कोई आश्चर्य नहीं कि इसका पता काफी भिन्न है - स्टैक और कोड को अलग-अलग कोड क्षेत्रों को निर्दिष्ट किया जाता है, यह बहुत दूर हो सकता है।

+0

के अंतरंग विवरण जानने की कोशिश कर रहे हैं, तो यहां आउटपुट उस स्थान का प्रतिनिधित्व करता है जहां यह विशेष फ़ंक्शन कोड सेगमेंट के हिस्से के रूप में लोड किया गया है? क्या सी प्रोग्राम को डेटा सेगमेंट प्रिंट करने का कोई तरीका है, कोड सेगमेंट स्टार्ट/एंड पतों? – helpmelearn

+0

@helpmelearn: हाँ, वह पता है जहां फ़ंक्शन प्रारंभ होता है। मुझे सेगमेंट पते खोजने के लिए समाधान के बारे में पता नहीं है और मुझे लगता है कि यह कार्यान्वयन-निर्भर होगा। शायद कुछ उपयोगिता कार्यक्रम है जो किसी भी प्रक्रिया के लिए ऐसा कर सकता है। – sharptooth

3

पुस्तक UNIX: Systems Programming बातें स्पष्ट करना चाहिए की यह छवि।

आरेख के नीचे, आपके पास अपना प्रोग्राम टेक्स्ट (कम पता) है। जैसा कि आपके कार्यक्रम से सत्यापित किया जा सकता है। वह जगह है जहां foo() रहेंगे। ध्यान में रखने की

alt text

2

एक बात है कि अपने कोड पूरी तरह से मानकों के अनुरूप नहीं है। यदि आप gcc -Wall -Wextra -pedantic -ansi का उपयोग करते हैं तो आपको उस लाइन के बारे में शिकायत मिल जाएगी जहां आप फ़ंक्शन पॉइंटर प्रिंट कर रहे हैं। ऐसा इसलिए है क्योंकि मानक गारंटी नहीं देता है कि फ़ंक्शन पॉइंटर्स को शून्य पॉइंटर्स में परिवर्तित किया जा सकता है। सी को कई अलग-अलग आर्किटेक्चर पर काम करने के लिए डिज़ाइन किया गया है, और यदि आर्किटेक्चर हार्वर्ड आर्किटेक्चर (अलग निर्देश और डेटा मेमोरी) है तो इन पॉइंटर्स को विभिन्न आकार बनाने के अच्छे कारण हो सकते हैं।

मुझे लगता है कि व्यावहारिक रूप से इससे कोई फर्क नहीं पड़ता है, लेकिन इसके बारे में जागरूक होने के लिए एक अच्छा तथ्य है। Esp जब आप सी

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