c - Difference between pointer to pointer and pointer to 2d array -


  • यदि मेरे पास एक 2 डी सरणी बी परिभाषित है:

        इंट बी [2] [3] = {{1,3,5}, {2,4,6}};   

    क्या int ** p = b जैसा कि int (* p) [3] = B ?

    < / Li>
  • int ** f = B; Printf ("% d", * f + 1);

    आउटपुट के रूप में 5 देता है जबकि printf ("% d", * f) < / कोड> उत्तर के रूप में 1 देता है। ऐसा क्यों हो रहा है?

  • प्रिंटफ़ ("% d", ** f);

    एक सेगमेंटेशन गलती देता है! क्यों?

    1. नहीं int ** p = B; एक त्रुटि है (एक संकलन त्रुटि दोनों, और एक तार्किक त्रुटि)। एक int ** को एक int * पर इंगित करना चाहिए। हालांकि, बी में int * संग्रहीत नहीं है। बी किसी भी संकेत के साथ संगत int s का समूह है।

    2. int ** f = B ; को एक संकलन त्रुटि देना चाहिए परिणामस्वरूप उत्पन्न किसी निष्पादन योग्य का व्यवहार पूरी तरह से अपरिभाषित है।

    3. देखें 2।


    व्याख्या करने के लिए आप 1 और 5 क्यों देख रहे हैं (सी मानक इसे परिभाषित नहीं करता है, लेकिन वैसे भी आगे चलकर आपके कंपाइलर बैल)। शायद आपका कंपाइलर लाइन को

      int ** f = (int **) बी के रूप में व्यवहार करता है;  

    तब अभिव्यक्ति * f को B के संग्रह से बाइट्स पढ़ा जाएगा (जो वास्तव में int S) और बहाना है कि ये बाइट्स हैं जो एक सूचक का प्रतिनिधित्व करते हैं। यह आगे अपरिभाषित व्यवहार (सख्त-अलियासिंग नियमों का उल्लंघन) है संभवतः इसका परिणाम यह है कि * f एक संकेतन है जो 0x00000001 पते पर है।

    फिर आप % d का उपयोग करके एक संकेतक मुद्रित कर सकते हैं, जिसके कारण आगे अपरिभाषित व्यवहार होता है। आप 1 को देख सकते हैं क्योंकि आपका सिस्टम int को पास करने के लिए int से प्रिंटफ़ पास करने के लिए एक ही विधि का उपयोग करता है ।

    जब आप 1 से (int *) 0x00000001 जोड़ते हैं, तो आप (int *) 0x00000005 प्राप्त करते हैं, क्योंकि एक सूचक बढ़ने से अगले बिंदु पर इंगित होता है उस प्रकार का तत्व

    जब आप इस सूचक को डीरेफर करते हैं, तो यह एक सीगफ़ॉल्ट का कारण बनता है क्योंकि यह पता आपके मान्य पता स्थान से बाहर है।


    Comments

    Popular posts from this blog

    Member with no value in F# -

    java - Joda Time Interval Not returning what I expect -

    c# - Showing a SelectedItem's Property -