2011-08-16 24 views
6

यह एक सवाल सवाल से उत्तरों के आधार पर है:चार सरणी वी.एस. चार *

const char myVar* vs. const char myVar[]

const char* x = "Hello World!"; 
const char x[] = "Hello World!"; 

मैं अंतर अब समझते हैं, लेकिन मेरी नई प्रश्न हैं:

(1) क्या यदि मैं x को फिर से सौंपूं तो पहली पंक्ति में "हैलो वर्ल्ड" स्ट्रिंग का होता है? उस बिंदु से कुछ भी इंगित नहीं करेगा - क्या दायरा समाप्त होने पर इसे नष्ट कर दिया जाएगा?

(2) कॉन्स्टेस के अलावा, दो उदाहरणों में मानों को संकलक द्वारा स्मृति में अलग-अलग कैसे संग्रहीत किया जाता है?

उत्तर

9

आपके कोड में "Hello World!" रखकर संकलक को संकलित निष्पादन योग्य में उस स्ट्रिंग को शामिल करने का कारण बनता है। जब प्रोग्राम निष्पादित किया जाता है कि कॉल को main पर कॉल करने से पहले मेमोरी में बनाया गया है और मेरा मानना ​​है कि असेंबली कॉल __start (जो स्थिर प्रारंभिक प्रारंभकर्ता शुरू होता है) से पहले भी। char * x की सामग्री new या malloc, या main के ढेर फ्रेम में आवंटित नहीं की जाती है, और इसलिए इसे आवंटित नहीं किया जा सकता है।

हालांकि, एक char x[20] = "Hello World" एक समारोह या विधि के भीतर घोषित ढेर पर आवंटित किया जाता है, और जब दायरे में, वहाँ वास्तव में दो स्मृति में है कि "Hello World" की प्रतियां होगा - एक stack- में एक निष्पादन के साथ प्री-लोडेड, आवंटित बफर

+0

कॉन्स चार एक्स [] डेटा को स्टैक पर प्रतिलिपि बनाना है। –

-1
  1. औपचारिक रूप से दोनों ही मामलों में "Hello World!" स्ट्रिंग char का एक सन्निहित अनुक्रम के रूप में स्थिर स्मृति में आवंटित किया जाता है, इसलिए वहाँ पुनः प्राप्त करने के लिए कोई गतिशील आबंटित स्मृति है और न ही नष्ट करने के लिए किसी भी वर्ग उदाहरण है;
  2. x दोनों को स्थिर स्मृति या ढेर पर आवंटित किया जाएगा, जहां वे परिभाषित किए गए हैं। हालांकि सूचक को प्रारंभ किया जाएगा ताकि "Hello World!" स्ट्रिंग को इंगित किया जा सके, जबकि सरणी को सीधे स्ट्रिंग अक्षर की प्रतिलिपि बनाकर प्रारंभ किया जाएगा।

सिद्धांत रूप में संकलक दोनों स्ट्रिंग अक्षरों की स्मृति को पुनः प्राप्त करने के लिए स्वतंत्र है जब उन्हें एक्सेस करने के कोई तरीके नहीं हैं; व्यावहारिक रूप से पहले व्यक्ति को पुनः दावा करने की संभावना नहीं है, क्योंकि आम तौर पर स्थिर स्मृति को समाप्त होने तक कार्यक्रम में आवंटित किया जाता है; दूसरी ओर यदि सरणी को सरणी पर आवंटित किया जाता है तो दूसरा भी आवंटित नहीं किया जा सकता है, क्योंकि संकलक अन्य माध्यमों का उपयोग कर सकता है ताकि यह सुनिश्चित किया जा सके कि सरणी ठीक तरह से शुरू हो गई है, और सरणी मेमोरी को पुनः प्राप्त होने पर पुनः दावा किया जाएगा गुंजाइश।

+0

इसके अलावा, पॉइंटर के साथ आकार (x) करने के परिणामस्वरूप 4 (या 64 बिट कोड में 8) का परिणाम होगा, जबकि सरणी के साथ आकार (x) के परिणामस्वरूप सरणी में बाइट्स की संख्या होगी। – Matthew

+2

-1: वे उसी तरह आवंटित नहीं किए जाते हैं। पहला उदाहरण स्थैतिक स्मृति के लिए एक सूचक है। दूसरा उदाहरण एक गैर स्थैतिक सरणी है जिसका सामग्री 'हैलो वर्ल्ड!' के साथ शुरू की गई है। –

+2

मुझे लगता है कि कॉन्स्ट चार एक्स [] के पीछे विचार यह है कि सरणी स्टैक पर है, न केवल एक सूचक, और "हैलो वर्ल्ड!" इसकी प्रतिलिपि बनाई गई है।इसे अनुकूलित किया जा सकता है, लेकिन विचार एक साधारण सूचक से काफी अलग है। –

4

कंपाइलर पहले रोडाटा (केवल पढ़ने के लिए डेटा) नामक स्मृति के एक खंड में संग्रहीत करता है। जब तक कार्यक्रम अभी भी चल रहा है, तब भी स्मृति में इसका प्रारंभिक मूल्य होता है।

दूसरा स्टैक पर किसी भी अन्य सरणी की तरह संग्रहीत किया जाता है। किसी भी अन्य स्थानीय चर की तरह, इसे अपने दायरे के समाप्त होने के बाद ओवरराइट किया जा सकता है।

+0

'जब तक प्रोग्राम अभी भी चल रहा है, स्मृति अभी भी अपना प्रारंभिक मान रखती है।' यही कहना है कि स्ट्रिंग का दायरा प्रोग्राम स्कोप है, न कि फ़ंक्शन की। –

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