2011-06-17 10 views

उत्तर

23

सरणी विघटित, या जब एक तर्क के रूप में एक समारोह को पारित कर दिया है, या जब एक 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 पहले अनुक्रम में। लेकिन आपके मामले में, मौजूदा सरणी मॉड्यूल में एक बाहरी परिभाषित सूचक के रूप में अपनी सरणी घोषित करके, और एक सरणी नहीं, यह सामान्य रूप से किए गए पॉइंटर पर अंतर्निहित रूपांतरण को छोड़ देगा, और केवल सरणी ऑब्जेक्ट का उपयोग करें-अगर यह ऑब्जेक्ट्स की एक सरणी नहीं, एक ऑब्जेक्ट के लिए एक सूचक था।

+0

कोई सुझाव है कि मैं इस व्यवहार पर और कहां पढ़ सकता हूं? – estebro

+2

मैं इस व्यवहार को देखने के लिए कंपाइलर आउटपुट को देखता हूं, यदि आप अपने मंच के लिए मूल असेंबली भाषा से परिचित हैं तो यह बहुत स्पष्ट है। आपको वास्तव में मशीन द्वारा सटीक तरीके से इलाज किया जाने वाला सरणी संदर्भ दिखाई देगा जैसे कि यह एक सूचक पहुंच था। [यह प्रश्न यहां] (http://stackoverflow.com/questions/1461432/what-is-array-decaying) कुछ सहायता भी प्रदान कर सकता है। – Jason

+0

अतिरिक्त जानकारी के लिए धन्यवाद (और इस तरह के पुराने प्रश्न पर वापस आने के लिए)। – estebro

15

अच्छी तरह से C FAQ में समझाया गया। और a followup है। दूसरे लिंक में तस्वीर दस लाख रुपये के लायक है।

char a[] = "hello"; 
char *p = "world"; 

enter image description here

लघु जवाब: उपयोग extern int a[]

0

मूल रूप से आप इस तरह अपने main.c लिखने के लिए आवश्यकता होगी:

extern int a[]; 

int main() 
{ 
    printf("%d\n", a[0]); 
    return 0; 
} 
2

थोड़ा देर हो चुकी है, इस समस्या का एक डुप्लिकेट अभी दर्ज किया गया था (और बंद)। यहां दिए गए उत्तरों में हेडर फाइलों का उल्लेख नहीं है ...

समस्या को संकलित समय पर पकड़ा जाएगा यदि आप सरणी a को हेडर फ़ाइल में घोषित करते हैं, जहां यह संबंधित है, इसे .c फ़ाइल में डालने के बजाय । हेडर फ़ाइल को तब .c फ़ाइलों में शामिल किया जाना चाहिए और संकलक देख सकता है कि आपने जो घोषित किया है वह गलत है।

आपका हेडर फाइल होते हैं:

extern int myarray[]; 

आप की तरह "error: conflicting types for a" यदि आप एक सूचक के रूप में a घोषित बजाय कुछ मिल जाएगा।

0

निम्नलिखित कोड का आउटपुट देखें।

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 क्यों नहीं पहुंच सकता है?

मुझे पता है कि इसे ऑपरेटिंग सिस्टम के साथ करना है ताकि उपयोगकर्ता पता द्वारा कुछ पता स्थान तक पहुंचा जा सके। मुझे बस इतना पता है। अगर आप अधिक जानकारी चाहते हैं तो इसे गूगल करें।

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