फ़ाइल 1.cसूचक सरणी-निर्वासन सवाल
int a[10];
फ़ाइल main.c:
extern int *a;
int main()
{
printf("%d\n", a[0]);
return 0;
}
मुझे एक segfault देता है! क्या गलत हो रहा है?
फ़ाइल 1.cसूचक सरणी-निर्वासन सवाल
int a[10];
फ़ाइल main.c:
extern int *a;
int main()
{
printf("%d\n", a[0]);
return 0;
}
मुझे एक segfault देता है! क्या गलत हो रहा है?
सरणी विघटित, या जब एक तर्क के रूप में एक समारोह को पारित कर दिया है, या जब एक R- करने के लिए परिवर्तित परोक्ष संकेत करने के लिए परिवर्तित कर रहे हैं असाइनमेंट ऑपरेटर के दाईं ओर मूल्य। तो कुछ ऐसा:
int array[10];
int* a = array; //implicit conversion to pointer to type int
void function(int* a);
function(array); //implicit conversion to pointer to type int
ठीक काम करता है। लेकिन का मतलब नहीं है कि सरणी स्वयं पॉइंटर्स हैं। इसलिए यदि आप एक संकेतक के रूप में एक संकेतक के रूप में व्यवहार करते हैं, तो आप वास्तव में सरणी प्रकार का इलाज कर रहे हैं-अगर यह एक सूचक था जिसने int
ऑब्जेक्ट को पता रखा था। चूंकि आपकी सरणी वास्तव में int
ऑब्जेक्ट्स का अनुक्रम है, और int
ऑब्जेक्ट्स पर पॉइंटर्स नहीं है, तो आप वास्तव में कुछ स्मृति स्थान को अस्वीकार करने का प्रयास कर रहे हैं जो कहीं भी मान्य नहीं है (यानी, array
में पहला स्लॉट एक संख्यात्मक पूर्णांक मान है 0
की तरह जो एक पूर्ण डीरेंसिंग की तरह होगा)। तो यही कारण है कि आप segfaulting कर रहे हैं। ध्यान दें कि यदि आप कुछ इस तरह किया था:
int array[] = { 1, 2, 3, 4, 5};
int b = *array;
अभी भी काम करता है यही कारण है, array
के बाद फिर से परोक्ष स्मृति ब्लॉक कि पूर्णांक मूल्यों का एक अनुक्रम पकड़े और है करने के लिए एक सूचक में बदल जाती है तो मूल्य प्राप्त करने के dereferenced पहले अनुक्रम में। लेकिन आपके मामले में, मौजूदा सरणी मॉड्यूल में एक बाहरी परिभाषित सूचक के रूप में अपनी सरणी घोषित करके, और एक सरणी नहीं, यह सामान्य रूप से किए गए पॉइंटर पर अंतर्निहित रूपांतरण को छोड़ देगा, और केवल सरणी ऑब्जेक्ट का उपयोग करें-अगर यह ऑब्जेक्ट्स की एक सरणी नहीं, एक ऑब्जेक्ट के लिए एक सूचक था।
अच्छी तरह से C FAQ में समझाया गया। और a followup है। दूसरे लिंक में तस्वीर दस लाख रुपये के लायक है।
char a[] = "hello";
char *p = "world";
लघु जवाब: उपयोग extern int a[]
।
मूल रूप से आप इस तरह अपने main.c लिखने के लिए आवश्यकता होगी:
extern int a[];
int main()
{
printf("%d\n", a[0]);
return 0;
}
थोड़ा देर हो चुकी है, इस समस्या का एक डुप्लिकेट अभी दर्ज किया गया था (और बंद)। यहां दिए गए उत्तरों में हेडर फाइलों का उल्लेख नहीं है ...
समस्या को संकलित समय पर पकड़ा जाएगा यदि आप सरणी a
को हेडर फ़ाइल में घोषित करते हैं, जहां यह संबंधित है, इसे .c फ़ाइल में डालने के बजाय । हेडर फ़ाइल को तब .c फ़ाइलों में शामिल किया जाना चाहिए और संकलक देख सकता है कि आपने जो घोषित किया है वह गलत है।
आपका हेडर फाइल होते हैं:
extern int myarray[];
आप की तरह "error: conflicting types for a
" यदि आप एक सूचक के रूप में a
घोषित बजाय कुछ मिल जाएगा।
निम्नलिखित कोड का आउटपुट देखें।
File1.c
#include <stdio.h>
extern int* my_arr;
void my_print()
{
printf("%d", my_arr);
}
main.c
#include <stdio.h>
int my_arr[2] = {1,2};
extern void my_print();
void main()
{
my_print();
}
उत्पादन
1
File1.c my_arr अंदर एक सूचक चर अर्थ 1. का मूल्य होता है My_arr [] का पहला तत्व इसे सौंपा गया था। फिर यदि आप स्मृति स्थान ox1 तक पहुंचने के लिए * my_arr का उपयोग करते हैं, तो आपको सीजी गलती मिलती है क्योंकि आपको ऑक्स 01 तक पहुंचने की अनुमति नहीं है।
क्यों my_arr सूचक 1 असाइन किया गया था (my_arr का पहला तत्व [])?
असेंबलर कैसे काम करता है इसके साथ क्या करना है। this article
आपका कोड 0x01 क्यों नहीं पहुंच सकता है?
मुझे पता है कि इसे ऑपरेटिंग सिस्टम के साथ करना है ताकि उपयोगकर्ता पता द्वारा कुछ पता स्थान तक पहुंचा जा सके। मुझे बस इतना पता है। अगर आप अधिक जानकारी चाहते हैं तो इसे गूगल करें।
कोई सुझाव है कि मैं इस व्यवहार पर और कहां पढ़ सकता हूं? – estebro
मैं इस व्यवहार को देखने के लिए कंपाइलर आउटपुट को देखता हूं, यदि आप अपने मंच के लिए मूल असेंबली भाषा से परिचित हैं तो यह बहुत स्पष्ट है। आपको वास्तव में मशीन द्वारा सटीक तरीके से इलाज किया जाने वाला सरणी संदर्भ दिखाई देगा जैसे कि यह एक सूचक पहुंच था। [यह प्रश्न यहां] (http://stackoverflow.com/questions/1461432/what-is-array-decaying) कुछ सहायता भी प्रदान कर सकता है। – Jason
अतिरिक्त जानकारी के लिए धन्यवाद (और इस तरह के पुराने प्रश्न पर वापस आने के लिए)। – estebro