के अंदर एक स्ट्रिंग के लिए स्मृति आवंटित करना मुझे पता है कि यह प्रश्न चारों ओर रहा है, लेकिन मुझे थोड़ा धुंधला, लंबा या/और भ्रमित करने का जवाब मिला; इसलिए मैं पूरी तरह से बिंदु प्राप्त करने के लिए विशेष रूप से अपने कोड का उल्लेख करने जा रहा हूं।संरचना
typedef struct album {
unsigned int year;
char *artist;
char *title;
char **songs;
int songs_c;
} album ;
निम्नलिखित कार्य:
struct album* init_album(char *artist, char *album, unsigned int year){
struct album *a;
a= malloc(sizeof(struct album));
a->artist = malloc(strlen(artist) + 1);
strncpy(a->artist, artist, strlen(artist));
a->title = malloc(strlen(album) + 1);
strncpy(a->title, album, strlen(album));
a->year = year;
return a;
}
void add_song(struct album *a, char *song){
int index = a->songs_c;
if (index == 0){
a->songs = malloc(strlen(song));
} else a->songs[index] = malloc(strlen(song)+1);
strncpy(a->songs[index], song, strlen(song));
a->songs_c= a->songs_c+1;
}
और एक मुख्य कार्य:
int main(void){
char *name;
char artist[20] = "The doors";
char album[20] = "People are strange";
int year = 1979;
struct album *a;
struct album **albums;
albums = malloc(sizeof(struct album));
albums[0] = init_album((char *)"hihi", (char *)"hoho", 1988);
albums[1] = init_album((char *)"hihi1", (char *)"hoho1", 1911);
printf("%s, %s, %d\n", albums[0]->artist, albums[0]->title, albums[0]->year);
printf("%s, %s, %d\n", albums[1]->artist, albums[1]->title, albums[1]->year);
char song[] = "song 1\0";
add_song(albums[1], song);
free(albums[0]);
free(albums[1]);
}
विभाजन गलती जब में एक गीत को जोड़ने के लिए strncpy जारी करने
तो मैं इस struct मिला "add_song()"।
मैं गंभीर रूप से गलत क्या कर रहा हूं? जैसा कि कई गुना सुना है, सी में कार्यान्वयन का कोई "सही" तरीका नहीं है, जब तक यह काम करता है और यह छोटी नहीं है, यह ठीक है, लेकिन शुरुआत के रूप में स्मृति आवंटन का उपयोग करने के बारे में कुछ सावधानी प्रतिक्रिया या सलाह प्राप्त करना बहुत अच्छा होगा जटिल डेटा संरचनाओं के साथ।
धन्यवाद एक गुच्छा! /एस
चार गीत [] = "गीत 1 \ 0"; यह दो शून्य समाप्ति अक्षर जोड़ता है। जैसे ही आप "" उपयोग करते हैं, संकलक आपके लिए एक अदृश्य शून्य समाप्ति जोड़ देगा, आपको इसे मैन्युअल रूप से करने की आवश्यकता नहीं है। "एक्स" {'x', '\ 0'} जैसा ही है। – Lundin
@Vlad यह एक कठिन choise है। या तो सी/सी ++ में लिखें और स्मृति प्रबंधन के लिए प्रोग्रामर के समय का 9 0% खर्च करें, या एक और भाषा चुनें और उसी उद्देश्य के लिए प्रोग्राम निष्पादन समय का 9 0% खर्च करें। =) – Lundin
@ लंदन: बिल्कुल सही नहीं है। मैं कहूंगा कि यदि आपको किसी महत्वपूर्ण पथ पर आवंटित/मुक्त स्मृति की आवश्यकता है - यह एक खराब डिज़ाइन है, और कोई समस्या है चाहे आप सी या सी ++ का उपयोग करते हों, अन्यथा सी ++ से 'std :: string' का उपयोग नहीं किया जाएगा अपने प्रदर्शन को नुकसान पहुंचाएं, खासकर यदि आपके पास ऑब्जेक्ट पूल है (या यहां तक कि लॉक-फ्री ऑब्जेक्ट पूल)। –