दृष्टांत 1
int *nums = {5, 2, 1, 4};
printf("%d\n", nums[0]);
क्यों यह एक segfault करता है?
आपने nums
int के लिए एक सूचक के रूप में घोषित किया - जो कि स्मृति में एक पूर्णांक nums
के पते को धारण करना है ।
फिर आपने कई मानों nums
की एक सरणी को इनिशियलाइज़ करने की कोशिश की । इसलिए अधिक विवरण में खुदाई के बिना, यह वैचारिक रूप से गलत है - यह एक चर के लिए कई मूल्यों को निर्दिष्ट करने के लिए समझ में नहीं आता है जो कि इस मूल्य को धारण करने वाला है। इस संबंध में, यदि आप ऐसा करते हैं तो आपको ठीक वैसा ही प्रभाव दिखाई देगा:
int nums = {5, 2, 1, 4};
printf("%d\n", nums);
या तो मामले में (एक पॉइंटर या इंट चर के लिए कई मान निर्दिष्ट करें), फिर क्या होता है कि चर को पहला मान मिलेगा 5
, जबकि शेष मानों की अनदेखी की जाती है। यह कोड अनुपालन करता है लेकिन आपको प्रत्येक अतिरिक्त मूल्य के लिए चेतावनी मिलेगी जो असाइनमेंट में नहीं है:
warning: excess elements in scalar initializer
।
पॉइंटर वैरिएबल में कई मानों को असाइन करने के मामले में, जब आप एक्सेस करते हैं, तो प्रोग्राम सेगफॉल्ट करता है nums[0]
, जिसका अर्थ है कि आप एड्रेस 5 में जो कुछ भी स्टोर कर रहे हैं, उसे डिरेल कर रहे हैं । आपने nums
इस मामले में सूचक के लिए कोई मान्य मेमोरी आवंटित नहीं की थी ।
यह ध्यान देने योग्य होगा कि इंट वैरिएबल के लिए कई मान निर्दिष्ट करने के मामले के लिए कोई segfault नहीं है (आप यहां किसी भी अमान्य पॉइंटर को डीरफेर नहीं कर रहे हैं)।
SCENARIO 2
int nums[] = {5, 2, 1, 4};
यह एक सेगफॉल्ट नहीं करता है, क्योंकि आप कानूनी तौर पर स्टैक में 4 इन्टस की एक सरणी आवंटित कर रहे हैं।
SCENARIO 3
int *nums = {5, 2, 1, 4};
printf("%d\n", nums);
यह एक उम्मीद के मुताबिक नहीं करता है, क्योंकि आप खुद ही पॉइंटर के मूल्य को प्रिंट कर रहे हैं - ऐसा नहीं है कि यह डेरेफेरिंग (जो अमान्य मेमोरी एक्सेस है)।
अन्य
जब भी आप इस तरह एक पॉइंटर के मूल्य को हार्डकोड करते हैं, तो यह लगभग हमेशा सेगफॉल्ट के लिए बर्बाद होता है (क्योंकि यह निर्धारित करने के लिए ऑपरेटिंग सिस्टम का काम है कि कौन सी मेमोरी किस स्थान तक पहुंच सकती है)।
int *nums = 5;
इसलिए अंगूठे का एक नियम हमेशा कुछ आवंटित चर के पते के लिए एक सूचक को इनिशियलाइज़ करना है , जैसे:
int a;
int *nums = &a;
या,
int a[] = {5, 2, 1, 4};
int *nums = a;