2011-04-05 12 views
5

मैं अपने प्रोग्राम में मुख्य() तर्कों में से एक को पॉइंटर बनाने की कोशिश कर रहा हूं। मैंने प्रारंभिक सूचक सेट अप किया है, फिर मैंने इसे सरणी में दूसरे तत्व के बराबर सेट किया है, लेकिन संकलन गलती को संकलित करने का प्रयास करते समय मुझे एक त्रुटि मिलती है। क्या ऐसा होता है क्योंकि एक सूचक एक बुरे पते की ओर इशारा कर रहा है?मुख्य() तर्कों से स्ट्रिंग निकालने

यहाँ कोड है:

char *filename; 
*filename = argv[1]; 
printf("The filename is: %s", *filename); 

मैं सूचक के बारे में त्रुटियों को पूर्णांक के रूप में तर्क कास्ट करने के लिए कोशिश कर रहा हो। क्या ऐसा इसलिए है क्योंकि सूचक वास्तव में एक पूर्णांक पता मान है और मैं इसे एक स्ट्रिंग के बराबर सेट करने की कोशिश कर रहा हूं?

संपादित करें: जब मैं "filename = argv [1]" में बदलता हूं, तो मुझे अपने कंपाइलर से निम्न त्रुटि मिलती है: असाइनमेंट पॉइंटर लक्ष्य प्रकार से क्वालीफायर को छोड़ देता है।

उत्तर

7

संकलन करते समय एक सेगमेंटेशन गलती संभवतः नहीं हो सका। जब तक, संकलक स्मृति की सुरक्षा का उल्लंघन नहीं करता है, जो असंभव है। मैं इसे ले जाऊंगा कि जब आप प्रोग्राम चलाते हैं तो यह होता है: डी।

समस्या यहाँ है:

*filename = argv[1]; 

यह होना चाहिए:

filename = argv[1]; 

क्यों? आपने char पर पॉइंटर घोषित किया, प्रारंभिक, विशेष रूप से कहीं भी नहीं। फिर, आप संदर्भित उस सूचक स्थिति में पॉइंटर और असाइन किए गए डेटा। कौन सा है, ठीक है, कौन जानता है!

संपादित करें: printf() कॉल में आप filename को भी अस्वीकार करते हैं। उस * हटाएं :)।

इसके अलावा, जब आपने * फ़ाइल नाम असाइन किया था तो संकलक ने चेतावनी शूट की थी? बिना कलाकार के पॉइंटर से पूर्णांक बनाना, मेरा अनुमान होगा? चेतावनियों पर ध्यान दें, वे उपयोगी जानकारी प्रदान करते हैं!

चीयर्स।

+1

इसी तरह 'printf (" फ़ाइल नाम है:% s ", फ़ाइल नाम);'। '% S' विनिर्देशक एक चरित्र * सूचक * की अपेक्षा करता है। – dmckee

+0

जब मैं "filename = argv [1]" में बदलता हूं, तो मुझे अपने कंपाइलर से निम्न त्रुटि मिलती है: असाइनमेंट पॉइंटर लक्ष्य प्रकार से क्वालीफायर को छोड़ देता है। – Kelp

+1

@ केल्प: मुख्य int (int argc, char ** argv) 'या' int main (int argc, char * argv []) 'के साथ मुख्य परिभाषित करें। – pmg

3

कथन *filename = argv[1]; में, अभिव्यक्ति *filenamefilename पॉइंटर, जो कि कहीं भी अर्थपूर्ण इंगित नहीं कर रहा है, को अस्वीकार करने के लिए प्रयास करें (मान को इंगित करें)।

filename = argv[1] पर असाइनमेंट बदलें।

4

आप filename को argv[1] के समान स्थान पर नहीं बना रहे हैं। कि आप की आवश्यकता

filename = argv[1]; 

अपने संस्करण (*filename = argv[1];) के साथ ऐसा करने के लिए आप जो कुछ भी फ़ाइल नाम अंक मूल्य argv में है कि करने के लिए बनाने के लिए कोशिश कर रहे हैं [1]। इसके साथ बहुत सारी चीज़ें गलत हैं: ए) फ़ाइल नाम प्रारंभ नहीं किया गया है और यहां तक ​​कि अमान्य स्थानों को भी इंगित कर सकता है; बी) argv[1] टाइप char* है और आप इसे char के प्रकार में रखने की कोशिश कर रहे हैं!

0

जब आप इसे असाइन करने का प्रयास करते हैं तो आप char * को संदर्भित कर रहे हैं, इसलिए आप एक पॉइंटर को चार में भरने की कोशिश कर रहे हैं। और चूंकि फ़ाइल नाम अनियमित है, तो आप कुछ यादृच्छिक पते (या शायद 0x00000000 पता लगाने की कोशिश कर रहे हैं।और आपका प्रिंट स्टेटमेंट, यदि आप अब तक काम नहीं करेंगे, तो आप काम नहीं करेंगे: आप फिर से char * (char प्राप्त करने के लिए) को संदर्भित कर रहे हैं और फिर printf को एक नल-टर्मिनेटेड स्ट्रिंग के पॉइंटर के रूप में व्याख्या करने के लिए कह रहे हैं।

इस प्रयास करें:

char *filename ; 
filename = argv[1] ; 
printf("The filename is: %s" , filename) ; 
संबंधित मुद्दे