2012-10-18 14 views
18

मैं एक कस्टम "वेक्टर" संरचना लिख ​​रहा हूं। चूंकि मैं बहुत नया हूं, मुझे समझ में नहीं आता कि मुझे "Warning: "one" may be used uninitialized" क्यों मिल रहा है।सी: चेतावनी: एक्स का उपयोग इस फ़ंक्शन में अनियमित किया जा सकता है

यह मेरा vector.h फ़ाइल

#ifndef VECTOR_H 
#define VECTOR_H 

typedef struct Vector{ 
    int a; 
    int b; 
    int c; 
}Vector; 

#endif /* VECTOR_ */ 

चेतावनी लाइन पर यहाँ आता है one->a = 12

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#include "vector.h" 

int main(void){ 
    Vector* one; 
    one->a = 12; 
    one->b = 13; 
    one->c = -11; 
} 

उत्तर

31

one में पूर्वानुमान लगाना कठिन स्थान पर अंक तो सौंपा नहीं गया है। आप या तो ढेर पर रखें चाहिए:

Vector one; 
one.a = 12; 
one.b = 13; 
one.c = -11 

या गतिशील इसके लिए स्मृति को आबंटित:

Vector* one = malloc(sizeof(*one)) 
one->a = 12; 
one->b = 13; 
one->c = -11 
free(one); 

नोट इस मामले में free का उपयोग। आम तौर पर, malloc पर किए गए प्रत्येक कॉल के लिए आपको free पर बिल्कुल एक कॉल की आवश्यकता होगी।

12

क्योंकि आप जो एक सूचक है one के लिए एक मूल्य, आवंटित नहीं किया, आप चेतावनी मिलती है । यह अपरिभाषित व्यवहार है।

आप इस तरह यह घोषणा करना चाहिए:

Vector* one = malloc(sizeof(Vector)); 

या इस तरह:

one.a = 12; 
one.b = 13; 
one.c = -11; 

: जो मामले में

Vector one; 

आप इस तरह . साथ -> ऑपरेटर बदलने की आवश्यकता अंत में, सी 99 में और बाद में आप नामित i का उपयोग कर सकते हैं I nitializers:

Vector one = { 
    .a = 12 
, .b = 13 
, .c = -11 
}; 
4

जब आप Vector *one का उपयोग करते हैं तो आप केवल संरचना के लिए सूचक बना रहे हैं लेकिन इसमें कोई स्मृति आवंटित नहीं है।

मेमोरी घोषित करने और इसे तुरंत चालू करने के लिए बस one = (Vector *)malloc(sizeof(Vector)); का उपयोग करें।

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

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