नेस्टेड स्ट्रक्चर क्या है?
एक स्ट्रक्चर के अंदर दूसरी स्ट्रक्चर की घोषणा को नेस्टेड स्ट्रक्चर या स्ट्रक्चर के भीतर स्ट्रक्चर कहते हैं। यह संबंधित डेटा को तार्किक रूप से समूहित करने के लिए उपयोगी है।
घोषणा के तरीके
तरीका 1: अलग स्ट्रक्चर फिर नेस्टिंग
struct Address {
char city[30];
char state[30];
int zip;
};
struct Employee {
int id;
char name[50];
struct Address addr; // नेस्टेड स्ट्रक्चर चर
};
तरीका 2: अनाम नेस्टेड स्ट्रक्चर
struct Employee {
int id;
char name[50];
struct { // कोई टैग नाम नहीं
char city[30];
char state[30];
int zip;
} addr;
};
तरीका 3: पॉइंटर से नेस्टिंग (डायनामिक)
struct Employee {
int id;
char name[50];
struct Address *addr; // पॉइंटर - अलग आवंटन
};
सदस्य एक्सेस
डॉट ऑपरेटर (.) चेन करके:
struct Employee emp;
emp.addr.city = "Delhi"; // सही नहीं - स्ट्रिंग कॉपी चाहिए
strcpy(emp.addr.city, "Delhi");
emp.addr.zip = 110001;
// पॉइंटर के साथ
struct Employee *ptr = &emp;
strcpy(ptr->addr.city, "Mumbai");
उदाहरण प्रोग्राम
#include <stdio.h>
#include <string.h>
struct Person {
char name[50];
int age;
char gender;
struct Address {
char city[30];
char state[30];
int zipcode;
} addr;
};
int main() {
struct Person p[2];
int i;
for (i = 0; i < 2; i++) {
printf("\nव्यक्ति %d:\n", i+1);
printf(" नाम: "); scanf(" %49[^\n]", p[i].name);
printf(" आयु: "); scanf("%d", &p[i].age);
printf(" लिंग (M/F): "); scanf(" %c", &p[i].gender);
printf(" शहर: "); scanf(" %29[^\n]", p[i].addr.city);
printf(" राज्य: "); scanf(" %29[^\n]", p[i].addr.state);
printf(" पिन: "); scanf("%d", &p[i].addr.zipcode);
}
printf("\n=== दर्ज डेटा ===\n");
for (i = 0; i < 2; i++) {
printf("\nव्यक्ति %d:\n", i+1);
printf(" नाम: %s\n", p[i].name);
printf(" आयु: %d\n", p[i].age);
printf(" लिंग: %c\n", p[i].gender);
printf(" शहर: %s\n", p[i].addr.city);
printf(" राज्य: %s\n", p[i].addr.state);
printf(" पिन: %d\n", p[i].addr.zipcode);
}
return 0;
}
मूल प्रोग्राम की समस्याएं (सुधार)
मूल कोड में कई बग थे:
gets()असुरक्षित और हटाया गया (C11) -fgets()याscanf(" %[^\n]")उपयोग करें- बफर क्लियरिंग के लिए
scanf("%c", &temp)अविश्वसनीय -" %c"में अग्रणी स्पेस उपयोग करें - सरणी सूचकांक
i=1से शुरू - C में 0-आधारित a[i]नेस्टेड सरणी में गलत - अलग सरणी आकार
नेस्टेड स्ट्रक्चर के लाभ
- तार्किक समूहन: पता, वेतन विवरण, तिथि आदि अलग स्ट्रक्चर में
- पुनरुपयोगिता:
Addressकई स्ट्रक्चर में उपयोग हो सकता है - पठनीयता:
emp.addr.cityस्पष्ट है - मॉड्यूलरिटी: प्रत्येक स्ट्रक्चर अलग फाइल में परिभाषित हो सकती है
मेमोरी लेआउट
struct Employee {
int id; // 4 बाइट्स
char name[50]; // 50 बाइट्स
struct Address { // नेस्टेड - कोई अतिरिक्त ओवरहेड नहीं
char city[30]; // 30
char state[30]; // 30
int zip; // 4
} addr; // कुल 64 बाइट्स (पैडिंग सहित)
};
// कुल ≈ 118 बाइट्स (अलाइनमेंट के साथ)