2013-03-11 9 views
6

में एक चार सूचक भरना मैंने मॉडल (char * मॉडल) और मॉडल (int वर्ष) के वर्ष के साथ "कार" संरचना परिभाषित की है। मेरे पास एक ऐसा कार्य है जो एक नई कार संरचना तैयार करेगा; हालांकि, चार पॉइंटर्स की प्रतिलिपि बनाते समय यह सीजी दोषपूर्ण है। यह एक लिंक्ड सूची के लिए एक नया नोड बनाने के लिए माना जाता है।संरचना

Car *newCar(char *model, int year){ 
    Car *new = malloc(sizeof(Car)); 
    new->year = year; 
    new->model = malloc(MAX_LENGTH*sizeof(char)); 
    strcpy(new->model, model); 
    new->next = NULL; 
    return new; 
} 
+0

कैसे के बारे में 'new-> मॉडल = malloc (strlen (मॉडल) + 1)'? – cnicutar

+4

आपको यह जांचना चाहिए कि 'char * model' 'NULL' नहीं है। साथ ही, अच्छी प्रैक्टिस के रूप में, हमेशा 'मॉलोक' की वापसी की जांच करें। – congusbongus

+0

@cnicutar धन्यवाद; हालांकि, मुद्दे अभी भी वहां हैं। – kyle

उत्तर

2

भविष्य में संदर्भ के लिए इस समारोह मेरी समस्या का समाधान हो लिए ...

Car *createCar(char *model, int year){ 
    Car *new = malloc(sizeof(Car)); 
    new->year = year; 
    new->model = malloc(strlen(model)+1); 
    strcpy(new->model, model); 
    new->next = NULL; 
    return new; 
} 
+1

आपने गलत स्थान की जगह बनाई है। यह 'स्ट्रेलन (मॉडल) + 1' होना चाहिए। यदि यह आपकी समस्या को ठीक करने के लिए दिखाई देता है, तो आप अंडे पर चल रहे हैं! –

+0

@ एमएम आप सही हैं! मैं ताजा साल से अपने पुराने होमवर्क असाइनमेंट के माध्यम से जा रहा था और महसूस किया कि मैंने कभी समाधान पोस्ट नहीं किया है। मैंने आपके द्वारा चुने गए त्रुटि को प्रतिबिंबित करने के लिए अपना उत्तर अपडेट कर दिया है। – kyle

3

यहां आपका मॉडल चरित्र सूचक है।

लेकिन strcpy दो तर्क की आवश्यकता है - कि array या character pointer to which memory allocated by malloc or calloc

होना चाहिए लेकिन अपने strcpy(); चरित्र सूचक के रूप में एक तर्क जो स्वीकार नहीं किया जाएगा लेता है।

तो

new->model = malloc(strlen(model) + 1) बनाने के लिए और फिर अपने strcpy () यह काम करेंगे लिखें।

+1

या 'नया-> मॉडल = स्ट्रडअप (मॉडल);' जो करता है एक ही निर्देश में वही। –

+1

@EdouardThiel 'strdup' को छोड़कर मानक नहीं है (हालांकि इसे आसानी से कार्यान्वित किया जा सकता है)। – cnicutar

+0

strdup() एसवीआर 4, 4.3BSD, POSIX.1-2001 के अनुरूप है। –

1

नीचे कोड पर एक नज़र डालें और अपने कार्यक्रम के साथ तुलना, सुनिश्चित करें कि आप अपने प्रोग्राम के साथ गलत क्या है

#include <stdio.h> 
#include <string.h> 

typedef struct car{ 
char *model; 
int year; 
}Car; 

Car * newCar(char *, int); 

int main() 
{ 

Car *benz = newCar("S-class",1990); 

printf("\nModel = %s\n",benz->model); 
printf("\nYear = %d\n",benz->year); 

} 

Car * newCar(char *model, int year) 
{ 
    Car *new = malloc(sizeof(Car)); 
    new->year = year; 
    new->model = malloc(strlen(model)); 
    strcpy(new->model, model); 
    return new; 
} 
4

आप इस कोशिश कर सकते हैं पता लगाना होगा:

new->model = model == NULL ? NULL : strdup(model); 

इस रोकता है यदि मॉडल नल है तो आप एक बग से, अन्यथा आपको स्पेस की सटीक मात्रा में मॉलोक करें और इसे स्ट्रोकॉपी करें; इसके अलावा, यह आपको सभी मामलों में अंत में free(new->model) पर अनुमति देता है।