2011-03-26 19 views
6
#include<stdio.h> 

int main() 
{ 
    int *ip; 
    printf("Enter a no \n"); 
    scanf("%d",ip); 
    printf("ip=%d",*ip); 
} 

ऊपर मेरा कार्यक्रम है और यह निम्नलिखित जब मैं चलाने के लिए मूल्य पर पारित करने के लिए कैसे उत्पादनएक पूर्णांक सूचक

./a.out 
Enter a no 
10 
Segmentation fault 

है मैं gdb लाइन में जाँच 6 समस्या जो

scanf("%d",ip);

है

तो मुझे लगता है कि ip पूर्णांक के लिए एक सूचक है और %d पता मान की अपेक्षा करता है। जबकि मैं ip द्वारा निर्दिष्ट मान के पूर्णांक को पारित करने का प्रयास कर रहा हूं, इसलिए मुझे लगता है कि यह गलत है। लेकिन उपर्युक्त स्थिति में क्या करना सही है। मैं स्कैन का उपयोग करना चाहता हूं और ip (जो मेरे मामले में गुम है) द्वारा दिए गए पते पर एक पूर्णांक मान असाइन करना चाहता हूं।

उत्तर

5

डेविड हेफ़र्नन का समाधान सच है।हालांकि, यदि आप एक पॉइंटर का उपयोग करना चाहते हैं (यह जानने के लिए कि पॉइंटर कैसे काम करता है), तो आपको "malloc" के साथ मैन्युअल रूप से चर आवंटित करना होगा।

#include <stdio.h> 
#include <stdlib.h> /* for malloc and free */ 

int main (void) 
{ 
    int *ip = malloc(sizeof(int)); /* declare and allocate a new int pointer */ 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("ip = %d", *ip); 

    free(ip); /* free the memory */ 

    return 0; 
} 

malloc() और() stdlib.h में स्थित है। जब आप घोषित करते हैं:

int *ip; 

आप केवल एक संकेतक आवंटित करते हैं जो "कुछ नहीं" को इंगित करता है। तो आपको malloc() के साथ आवश्यक स्मृति आवंटित करना होगा। उसके बाद, * आपकी नई मेमोरी जगह पर आईपी पॉइंट्स और आईपी नई मेमोरी जगह का पता है।

आपको स्मृति को मैन्युअल रूप से मुक्त करना होगा जब आपको अब फ्री() के साथ चर की आवश्यकता नहीं है।

+0

हाँ आपको यह सही मिला है कि मैं समझने की कोशिश कर रहा हूं कि पॉइंटर कैसे काम करता है। –

1

आपको उस सूचक को स्मृति आवंटित करने की आवश्यकता है।

int *ip = malloc(sizeof(int)); 
// do stuff with ip 

free(ip); //free the memory allocated 

अधिक: http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

+0

@ एन 1.1 जो लिंक को पोस्ट करने के लिए एक महान लिंक धन्यवाद है। –

+0

@registered: आपका स्वागत है –

5

आप किसी भी भंडारण, केवल एक सूचक आवंटित नहीं किया है। पॉइंटर को इंगित करने के लिए कुछ चाहिए। आप इसे इस तरह करना चाहिए:

#include <stdio.h> 
int main(void) 
{ 
    int i; 

    printf("Enter a no \n"); 
    scanf("%d", &i); 
    printf("i=%d", i); 
    return 0; 
} 

मैं भी main() वैध की घोषणा, और एक मूल्य के लौटने की स्वतंत्रता ले लिया।

आप, संकेत के बारे में जानने के लिए तो इस तरह की कोशिश करना चाहते हैं:

#include <stdio.h> 
int main(void) 
{ 
    int i; 
    int* ip; 

    ip = &i; 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("*ip=%d", *ip); 
    return 0; 
} 

या यदि आप ढेर आवंटन के बजाय ढेर आवंटन हैं:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    int* ip; 

    ip = malloc(sizeof(int)); 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("*ip=%d", *ip); 
    free(ip); 
    return 0; 
} 
+0

हेफ़रमैन नहीं, मैं इसका उल्लेख करने की कोशिश नहीं कर रहा हूं। मैं बस टीपी को समझने की कोशिश कर रहा हूं कि जब मैं कुछ चीज़ों को पॉइंटर के रूप में घोषित करता हूं तो यह कुछ चीज़ कैसे स्टोर कर सकता है यह एक छोटा सा कार्यक्रम है जो मैं हूं काम करने की कोशिश कर रहा है। –

1

आप स्मृति को आबंटित करना चाहिए।

int* ip = malloc(sizeof(int)); 
scanf("%d", ip); 
... 
free(ip) 

या, बस एक ढेर चर

int i; 
scanf(%d, &i); 
1

नहीं, आप गलत हैं, उनका पता गुजरती हैं, आईपी एक पूर्णांक सूचक नहीं है। टाइप करें आईपी का पूर्णांक सूचक है, यानी आप जो आईपी को असाइन करते हैं वह एक पूर्णांक सूचक होना चाहिए। लेकिन आपने आईपी को कुछ भी असाइन नहीं किया था। तो आप कहां उम्मीद करते हैं कि स्कैनफ पूर्णांक मान संग्रहीत करता है?

2

यहाँ एक तरीका है इसे ठीक करने के:

#include<stdio.h> 
int main() { 
    int i; 
    printf("Enter a no \n"); 
    scanf("%d", &i); 
    printf("i=%d", i); 
} 

और एक और तरीका है:

#include<stdio.h> 
int main() { 
    int* ip = malloc(sizeof int); 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("ip=%d", *ip); 
} 

मूल के साथ समस्या यह है कि int* ip; सिर्फ एक पूर्णांक के लिए एक सूचक की घोषणा है, लेकिन आवंटन नहीं है वास्तविक पूर्णांक को पकड़ने के लिए कोई भी स्मृति, या अर्थपूर्ण कुछ भी इंगित करने के लिए सूचक को सेट करना। आपको बस कुछ यादृच्छिक स्मृति स्थान पर पॉइंटर मिल रहा है जो आपके प्रोग्राम द्वारा संबोधित किया जा सकता है या नहीं। तो आपको scanf() इस पॉइंटर को डेटा लिखने के लिए अस्वीकार करने का प्रयास करते समय एक सेगमेंटेशन गलती मिलती है।

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