2013-07-15 4 views
8

को मान निर्दिष्ट मैं सिर्फ सी सीखने शुरू कर दिया है और मैं विंडोज के लिए MinGW का उपयोग कर को समझने के लिए संकेत दिए गए काम के लिए कुछ सरल कार्यक्रमों बराबर चल रही है। मैंने कोशिश की है:सीधे सी प्वाइंटर

#include <stdio.h> 

int main(){ 
    int *ptr; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

जो सही तरीके से संकलित, लेकिन यह काम नहीं करता है जब मैं निष्पादन योग्य चलाने - मूल्य कमांड लाइन करने के लिए मुद्रित नहीं है, बजाय मुझे लगता है कि exe फ़ाइल कहते हैं एक त्रुटि संदेश मिलता काम करना बंद कर दिया।

लेकिन जब मैं नीचे के रूप में दिखाया गया है कि चर की स्मृति पते पर एक पूर्णांक चर और आवंटित * ​​ptr में मूल्य भंडारण की कोशिश की:

#include <stdio.h> 

int main(){ 
    int *ptr; 
    int q = 50; 
    ptr = &q; 
    printf("%d", *ptr); 
    return 0; 
} 

यह ठीक काम करता है।

मेरा प्रश्न है, मैं क्यों सीधे सूचक को एक शाब्दिक मान सेट करने में असमर्थ हूँ? मैंने पॉइंटर्स के लिए ट्यूटोरियल ऑनलाइन देखा है और उनमें से अधिकतर दूसरे उदाहरण के समान ही करते हैं।

किसी भी मदद की सराहना की है।

+0

क्योंकि पॉइंटर प्रारंभ नहीं हुआ है - यह कहीं भी कहीं भी इंगित कर सकता है और प्रोग्राम को क्रैश कर सकता है। – Till

+1

आप भाग्यशाली हो गए कि यह एक त्रुटि के साथ समाप्त हो गया। – JonnyRo

+1

@ जोनीरो सही है। वास्तविक कोड में, इस प्रकार की बग सप्ताह के लंबे डिबगिंग सत्रों को समझने की कोशिश करती है कि क्यों कुछ अन्य चर कुछ समय में यादृच्छिक रूप से बदलते हैं (कभी भी जब आप वास्तव में इसके लिए परीक्षण नहीं कर रहे होते हैं, हमेशा जब आप कर रहे होते हैं एक सार्वजनिक प्रदर्शन) या सुरक्षा शोषण जहां कोई अलग-अलग मूल्यों को जोड़कर "is_admin" ध्वज को सत्य में सेट करता है। – abarnert

उत्तर

20

समस्या यह है कि आप सूचक को प्रारंभ नहीं कर रहे है। आपने "कहीं भी चाहें" के लिए एक पॉइंटर बनाया है - जो कुछ अन्य चर, या आपके कोड के बीच का पता हो सकता है, या कुछ मेमोरी जो मैप नहीं है।

आपको int * चर के लिए स्मृति में int परिवर्तनीय बनाने की आवश्यकता है।

आपका दूसरे उदाहरण यह करता है, लेकिन यह अन्य चीजें हैं जो यहाँ प्रासंगिक नहीं हैं करता है। यहाँ सबसे सरल बात आपको बस इतना करना है:

int main(){ 
    int variable; 
    int *ptr = &variable; 
    *ptr = 20; 
    printf("%d", *ptr); 
    return 0; 
} 

यहाँ, int चर प्रारंभ-लेकिन नहीं है कि, ठीक है, क्योंकि आप बस को बदलने के लिए जो कुछ भी मूल्य 20 साथ था जा रहे हैं। कुंजी यह है कि सूचक को variable पर इंगित करने के लिए प्रारंभ किया गया है।

int main(){ 
    void *memory = malloc(sizeof(int)); 
    int *ptr = (int *)memory; 
    *ptr = 20; 
    printf("%d", *ptr); 
    free(memory); 
    return 0; 
} 
1

पहले उदाहरण में, ptr आरंभ नहीं किया गया है, तो यह एक अनिर्दिष्ट स्मृति स्थान को इंगित: वास्तव में, आप बस कुछ कच्चे स्मृति, अगर आप चाहते करने के लिए बात करने के लिए आवंटित कर सकते हैं। जब आप इस अनिर्दिष्ट स्थान पर कुछ असाइन करते हैं, तो आपका प्रोग्राम उड़ाता है।

दूसरे उदाहरण में, पता सेट किया गया है जब आप कहते हैं ptr = & क्ष, ताकि आप ठीक कर रहे हैं।

7

पहले कार्यक्रम टिप्पणियां

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create pointer to random memory address 

    int q = 50;   //Create local variable with contents int 50 

    ptr = &q;    //Update address targeted by above created pointer to point 
          // to local variable your program properly created 

    printf("%d", *ptr); //Happily print the contents of said local variable (q) 
    return 0; 
} 

कुंजी आप एक सूचक उपयोग नहीं कर सकते जब तक आप जानते हैं कि यह एक पता है कि आप अपने आप को कामयाब रहे करने के लिए आवंटित किया गया है, या तो साथ टिप्पणी

#include <stdio.h> 

int main(){ 
    int *ptr;    //Create a pointer that points to random memory address 

    *ptr = 20;   //Dereference that pointer, 
          // and assign a value to random memory address. 
          //Depending on external (not inside your program) state 
          // this will either crash or SILENTLY CORRUPT another 
          // data structure in your program. 

    printf("%d", *ptr); //Print contents of same random memory address 
          // May or may not crash, depending on who owns this address 

    return 0;    
} 

दूसरा कार्यक्रम के साथ इसे आपके द्वारा बनाए गए या मॉलोक कॉल के परिणामस्वरूप किसी अन्य चर पर इंगित करके।

इससे पहले इसका उपयोग कोड बना रहा है जो अनियमित स्मृति पर निर्भर करता है जो सबसे अच्छा क्रैश होगा, लेकिन कभी-कभी सबसे खराब काम पर, क्योंकि यादृच्छिक स्मृति पता आपके स्थान के मेमोरी स्पेस के अंदर होता है। ईश्वर आपकी मदद करता है अगर यह आपके प्रोग्राम में कहीं और डेटा संरचना को ओवरराइट करता है।

+1

अच्छा चित्रण। – abarnert

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