संरचना पैडिंग और पैकिंग


209

विचार करें:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

संरचनाओं के आकार क्रमशः 12 और 8 हैं।

क्या ये संरचनाएं गद्देदार या पैक हैं?

पैडिंग या पैकिंग कब होती है?



24
C संरचना पैकिंग की खोई कला - catb.org/esr/structure-packing
पाओलो

paddingचीजों को बड़ा बनाता है। packingचीजों को छोटा करता है। पूरी तरह से अलग।
smwikipedia

जवाबों:


264

पैडिंग संरचना सदस्यों को "प्राकृतिक" पता सीमाओं से संरेखित करता है - कहते हैं, intसदस्यों के पास ऑफ़सेट होंगे, जो mod(4) == 032-बिट प्लेटफॉर्म पर हैं। पैडिंग डिफ़ॉल्ट रूप से चालू है। यह आपकी पहली संरचना में निम्नलिखित "अंतराल" सम्मिलित करता है:

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

पैकिंग , दूसरी ओर कंपाइलर को गद्दी करने से रोकता है - यह स्पष्ट रूप से अनुरोध किया जाना है - जीसीसी के तहत __attribute__((__packed__)), इसलिए यह निम्नलिखित है:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

632-बिट आर्किटेक्चर पर आकार की संरचना का निर्माण करेगा ।

एक नोट हालांकि - अलिखित मेमोरी एक्सेस आर्किटेक्चर पर धीमी है जो इसे अनुमति देता है (जैसे x86 और amd64), और स्पष्ट रूप से SPARC जैसे सख्त संरेखण आर्किटेक्चर पर निषिद्ध है ।


2
मुझे आश्चर्य है: चिंगारी पर अनकही स्मृति का निषेध है इसका मतलब है कि यह एक सामान्य बाइट सरणियों से निपट नहीं सकता है? जैसा कि मुझे पता है कि स्ट्रक्चरिंग (ज्यादातर नेटवर्किंग) एक डेटा को संचारित करने में उपयोग की जाती है, जब आपको किसी संरचना को बाइट सरणी देने की आवश्यकता होती है, और सुनिश्चित करें कि एक सरणी एक संरचनात्मक फ़ील्ड में फिट होती है। अगर चिंगारी ऐसा नहीं कर सकती है, तो वे कैसे काम कर रहे हैं ?!
हाय-एंजेल

14
इसीलिए, यदि आप IP, UDP और TCP हेडर लेआउट को देखते हैं, तो आप देखेंगे कि सभी पूर्णांक फ़ील्ड संरेखित हैं।
निकोलाई फेटिसोव

17
"लॉस्ट आर्ट ऑफ सी स्ट्रक्चर पैकिंग" पैडिंग और पैकिंग के विवरण को बताता है - catb.org/esr/structure-packing
Rob11311

3
क्या पहले सदस्य को पहले आना होता है? मैंने सोचा कि गिरफ्तारी पूरी तरह से कार्यान्वयन तक है, और इस पर (यहां तक ​​कि संस्करण से संस्करण तक) भरोसा नहीं किया जा सकता है।
अल्लेउरोडे

4
+ allyourcode मानक गारंटी देता है कि सदस्यों के आदेश को संरक्षित रखा जाएगा और पहला सदस्य 0 ऑफसेट पर शुरू होगा।
मार्टिंक्यूनेव

64

( उपरोक्त उत्तरों ने कारण स्पष्ट रूप से स्पष्ट कर दिया है, लेकिन पैडिंग के आकार के बारे में पूरी तरह से स्पष्ट नहीं है, इसलिए, मैंने द लॉस्ट आर्ट ऑफ़ स्ट्रक्चर पैकिंग से जो कुछ सीखा है, उसके अनुसार उत्तर जोड़ूंगा , यह सीमा तक ही सीमित है C, लेकिन भी लागू करने के लिए Go, Rust )


मेमोरी संरेखित करें (संरचना के लिए)

नियम:

  • प्रत्येक व्यक्तिगत सदस्य से पहले, वहाँ पैडिंग होगी ताकि इसे उस पते पर शुरू किया जा सके जो इसके आकार से विभाज्य है।
    उदाहरण के लिए, 64 बिट सिस्टम पर, int4 से विभाज्य और long8 से, short2 से शुरू होना चाहिए ।
  • charऔर char[]विशेष हैं, कोई भी स्मृति पता हो सकता है, इसलिए उन्हें उनसे पहले गद्दी की आवश्यकता नहीं है।
  • के लिए struct, प्रत्येक व्यक्ति के सदस्य के लिए संरेखण की जरूरत के अलावा अन्य, पूरे struct खुद के आकार एक आकार विभाज्य करने के लिए सबसे बड़ा व्यक्तिगत सदस्य के आकार से, अंत में गठबंधन किया जाएगा गद्दी से।
    उदाहरण के लिए यदि संरचना का सबसे बड़ा सदस्य long8 से विभाज्य है, intतो 4 से, shortफिर 2 से।

सदस्य का आदेश:

  • सदस्य का क्रम संरचना के वास्तविक आकार को प्रभावित कर सकता है, इसलिए इसे ध्यान में रखें। उदाहरण के लिए stu_cऔर stu_dनीचे दिए गए उदाहरण में एक ही सदस्य हैं, लेकिन अलग-अलग क्रम में, और 2 संरचनाओं के लिए अलग-अलग आकार में परिणाम।

स्मृति में पता (संरचना के लिए)

नियम:

  • 64 बिट सिस्टम
    संरचना का पता (n * 16)बाइट्स से शुरू होता है । ( आप नीचे दिए गए उदाहरण में देख सकते हैं, सभी मुद्रित छतों के पते के साथ समाप्त होता है 0 )
    कारण : संभव सबसे बड़ा व्यक्तिगत संरचना सदस्य 16 बाइट्स है ( long double)।
  • (अपडेट) यदि किसी संरचना में केवल एकcharसदस्य के रूपमें शामिल है, तो इसका पता किसी भी पते पर शुरू हो सकता है।

खाली स्थान :

  • 2 संरचना के बीच की खाली जगह का उपयोग गैर-संरचना वाले चर द्वारा किया जा सकता है
    जो test_struct_address()नीचे फिट हो सकते हैं। नीचे उदाहरण में , चर xआसन्न संरचना gऔर के बीच रहता है h
    कोई फर्क नहीं पड़ता कि क्या xघोषित किया गया है, कोई hपता नहीं बदलेगा, xबस खाली जगह को gबर्बाद कर दिया।
    के लिए समान मामला y

उदाहरण

( 64 बिट सिस्टम के लिए )

memory_align.c :

/**
 * Memory align & padding - for struct.
 * compile: gcc memory_align.c
 * execute: ./a.out
 */ 
#include <stdio.h>

// size is 8, 4 + 1, then round to multiple of 4 (int's size),
struct stu_a {
    int i;
    char c;
};

// size is 16, 8 + 1, then round to multiple of 8 (long's size),
struct stu_b {
    long l;
    char c;
};

// size is 24, l need padding by 4 before it, then round to multiple of 8 (long's size),
struct stu_c {
    int i;
    long l;
    char c;
};

// size is 16, 8 + 4 + 1, then round to multiple of 8 (long's size),
struct stu_d {
    long l;
    int i;
    char c;
};

// size is 16, 8 + 4 + 1, then round to multiple of 8 (double's size),
struct stu_e {
    double d;
    int i;
    char c;
};

// size is 24, d need align to 8, then round to multiple of 8 (double's size),
struct stu_f {
    int i;
    double d;
    char c;
};

// size is 4,
struct stu_g {
    int i;
};

// size is 8,
struct stu_h {
    long l;
};

// test - padding within a single struct,
int test_struct_padding() {
    printf("%s: %ld\n", "stu_a", sizeof(struct stu_a));
    printf("%s: %ld\n", "stu_b", sizeof(struct stu_b));
    printf("%s: %ld\n", "stu_c", sizeof(struct stu_c));
    printf("%s: %ld\n", "stu_d", sizeof(struct stu_d));
    printf("%s: %ld\n", "stu_e", sizeof(struct stu_e));
    printf("%s: %ld\n", "stu_f", sizeof(struct stu_f));

    printf("%s: %ld\n", "stu_g", sizeof(struct stu_g));
    printf("%s: %ld\n", "stu_h", sizeof(struct stu_h));

    return 0;
}

// test - address of struct,
int test_struct_address() {
    printf("%s: %ld\n", "stu_g", sizeof(struct stu_g));
    printf("%s: %ld\n", "stu_h", sizeof(struct stu_h));
    printf("%s: %ld\n", "stu_f", sizeof(struct stu_f));

    struct stu_g g;
    struct stu_h h;
    struct stu_f f1;
    struct stu_f f2;
    int x = 1;
    long y = 1;

    printf("address of %s: %p\n", "g", &g);
    printf("address of %s: %p\n", "h", &h);
    printf("address of %s: %p\n", "f1", &f1);
    printf("address of %s: %p\n", "f2", &f2);
    printf("address of %s: %p\n", "x", &x);
    printf("address of %s: %p\n", "y", &y);

    // g is only 4 bytes itself, but distance to next struct is 16 bytes(on 64 bit system) or 8 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "g", "h", (long)(&h) - (long)(&g));

    // h is only 8 bytes itself, but distance to next struct is 16 bytes(on 64 bit system) or 8 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "h", "f1", (long)(&f1) - (long)(&h));

    // f1 is only 24 bytes itself, but distance to next struct is 32 bytes(on 64 bit system) or 24 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "f1", "f2", (long)(&f2) - (long)(&f1));

    // x is not a struct, and it reuse those empty space between struts, which exists due to padding, e.g between g & h,
    printf("space between %s and %s: %ld\n", "x", "f2", (long)(&x) - (long)(&f2));
    printf("space between %s and %s: %ld\n", "g", "x", (long)(&x) - (long)(&g));

    // y is not a struct, and it reuse those empty space between struts, which exists due to padding, e.g between h & f1,
    printf("space between %s and %s: %ld\n", "x", "y", (long)(&y) - (long)(&x));
    printf("space between %s and %s: %ld\n", "h", "y", (long)(&y) - (long)(&h));

    return 0;
}

int main(int argc, char * argv[]) {
    test_struct_padding();
    // test_struct_address();

    return 0;
}

निष्पादन परिणाम - test_struct_padding():

stu_a: 8
stu_b: 16
stu_c: 24
stu_d: 16
stu_e: 16
stu_f: 24
stu_g: 4
stu_h: 8

निष्पादन परिणाम - test_struct_address():

stu_g: 4
stu_h: 8
stu_f: 24
address of g: 0x7fffd63a95d0  // struct variable - address dividable by 16,
address of h: 0x7fffd63a95e0  // struct variable - address dividable by 16,
address of f1: 0x7fffd63a95f0 // struct variable - address dividable by 16,
address of f2: 0x7fffd63a9610 // struct variable - address dividable by 16,
address of x: 0x7fffd63a95dc  // non-struct variable - resides within the empty space between struct variable g & h.
address of y: 0x7fffd63a95e8  // non-struct variable - resides within the empty space between struct variable h & f1.
space between g and h: 16
space between h and f1: 16
space between f1 and f2: 32
space between x and f2: -52
space between g and x: 12
space between x and y: 12
space between h and y: 8

इस प्रकार प्रत्येक चर के लिए पता शुरू होता है: d0 x: dc h: e0 y: e8

यहां छवि विवरण दर्ज करें


4
"नियम" ने वास्तव में इसे बहुत स्पष्ट कर दिया है, मुझे कहीं भी सीधा नियम नहीं मिला। धन्यवाद।
परवेज़ आलम

2
@PervezAlam पुस्तक <The Lost Art of C Structure Packing>, नियमों को अच्छी तरह से समझाती है, यहां तक ​​कि सोचा कि यह इस उत्तर से थोड़ा लंबा है। पुस्तक मुफ्त में ऑनलाइन उपलब्ध है: catb.org/esr/structure-packing
Eric Wang

मैं इसे आज़माऊंगा, btw क्या यह स्ट्रक्चर पैकिंग तक सीमित है? बस जिज्ञासा के रूप में मैं पुस्तक में स्पष्टीकरण पसंद आया।
परवेज़ आलम

1
@PervezAlam यह एक बहुत ही छोटी पुस्तक है, मुख्य रूप से प्रौद्योगिकी पर ध्यान केंद्रित है जो कि सी प्रोग्राम की मेमोरी फ़ुटप्रिंट को कम कर देगा, इसे पढ़ने में समाप्त होने में केवल कई दिनों का समय लगता है।
एरिक वांग

1
@ValidusOculus हाँ, इसका मतलब है कि 16 बाइट संरेखित हैं।
एरिक वांग

44

मुझे पता है कि यह सवाल पुराना है और यहाँ अधिकांश उत्तर वास्तव में अच्छी तरह से पैडिंग बताते हैं, लेकिन खुद को समझने की कोशिश करते हुए मुझे लगा कि जो कुछ हो रहा है उसकी "दृश्य" छवि है।

प्रोसेसर एक निश्चित आकार (शब्द) के "चंक्स" में मेमोरी को पढ़ता है। मान लें कि प्रोसेसर शब्द 8 बाइट्स लंबा है। यह मेमोरी को 8 बाइट्स बिल्डिंग ब्लॉक्स की एक बड़ी पंक्ति के रूप में देखेगा। हर बार इसे मेमोरी से कुछ जानकारी प्राप्त करने की आवश्यकता होती है, यह उन ब्लॉकों में से एक तक पहुंच जाएगा और इसे प्राप्त करेगा।

विविधताएं संरेखण

जैसा कि ऊपर की छवि में लगता है, कोई फर्क नहीं पड़ता जहां एक चार (1 बाइट लंबा) है, क्योंकि यह उन ब्लॉकों में से एक के अंदर होगा, केवल 1 शब्द को संसाधित करने के लिए सीपीयू की आवश्यकता होती है।

जब हम एक बाइट से बड़े डेटा के साथ सौदा करते हैं, जैसे 4 बाइट इंट या 8 बाइट डबल, जिस तरह से उन्हें मेमोरी में संरेखित किया जाता है, वह सीपीयू द्वारा कितने शब्दों को संसाधित करना होगा, इस पर फर्क पड़ता है। यदि 4-बाइट का हिस्सा एक तरह से संरेखित किया जाता है तो वे हमेशा एक ब्लॉक के अंदर फिट होते हैं (मेमोरी एड्रेस 4 के एक से अधिक होने पर) केवल एक शब्द को संसाधित करना होगा। अन्यथा 4-बाइट्स का एक हिस्सा एक ब्लॉक पर खुद का हिस्सा हो सकता है और दूसरे पर हिस्सा, प्रोसेसर को इस डेटा को पढ़ने के लिए 2 शब्दों को संसाधित करने की आवश्यकता होती है।

यह 8-बाइट डबल पर लागू होता है, सिवाय इसके कि यह हमेशा एक ब्लॉक के अंदर होगा इसकी गारंटी देने के लिए 8 के एक मेमोरी एड्रेस में होना चाहिए।

यह एक 8-बाइट वर्ड प्रोसेसर पर विचार करता है, लेकिन अवधारणा शब्दों के अन्य आकारों पर लागू होती है।

उन आंकड़ों के बीच अंतराल को भरने के द्वारा पैडिंग कार्य करता है, यह सुनिश्चित करने के लिए कि वे उन ब्लॉकों के साथ संरेखित हैं, इस प्रकार मेमोरी को पढ़ने के दौरान प्रदर्शन में सुधार होता है।

हालांकि, जैसा कि दूसरों के जवाबों में कहा गया है, कभी-कभी यह स्थान अधिक मायने रखता है और फिर प्रदर्शन भी। हो सकता है कि आप कंप्यूटर पर बहुत अधिक डेटा संसाधित कर रहे हों जिसमें बहुत अधिक रैम न हो (स्वैप स्पेस का उपयोग किया जा सकता है लेकिन यह बहुत धीमा है)। आप प्रोग्राम में चर तब तक व्यवस्थित कर सकते हैं जब तक कि कम से कम पैडिंग न हो जाए (क्योंकि यह कुछ अन्य उत्तरों में बहुत ही अनुकरणीय था) लेकिन अगर यह पर्याप्त नहीं है तो आप स्पष्ट रूप से पैडिंग को अक्षम कर सकते हैं, जो कि पैकिंग है।


3
यह संरचना पैकिंग की व्याख्या नहीं करता है, लेकिन यह सीपीयू शब्द संरेखण को काफी अच्छी तरह से दिखाता है।
डेविड फ़ॉस्टर

क्या आपने उसे पेंट में लिया है? :-)
सिरो सेंटिल्ली 郝海东 冠状 ill ill 法轮功 '

1
@ CiroSantilli709 大 六四 事件 法轮功 it imp, यह जिम्प पर था, लेकिन मुझे लगता है कि मैंने इसे पेंट पर करने में कुछ समय बचाया होगा हालांकि haha
IanC

1
ओपन सोर्स (वाई) के बाद से और भी बेहतर
Ciro Santilli 冠状

21

संरचना पैकिंग, संरचना पैडिंग को दबाती है, जब संरेखण सबसे अधिक मायने रखता है, तो अंतरिक्ष में सबसे अधिक मायने रखता है जब पैकिंग का उपयोग किया जाता है।

कुछ संकलक #pragmaपैडिंग को दबाने या इसे बाइट्स की संख्या में पैक करने के लिए प्रदान करते हैं । कुछ ऐसा करने के लिए कीवर्ड प्रदान करते हैं। आमतौर पर प्रागमा जो संरचना पैडिंग को संशोधित करने के लिए उपयोग किया जाता है, नीचे प्रारूप में होगा (कंपाइलर पर निर्भर करता है):

#pragma pack(n)

उदाहरण के लिए ARM, __packedस्ट्रक्चर पेडिंग को दबाने के लिए कीवर्ड प्रदान करता है । इसके बारे में अधिक जानने के लिए अपने कंपाइलर मैनुअल के माध्यम से जाएँ।

तो पैक्ड संरचना पैडिंग के बिना एक संरचना है।

आम तौर पर पैक्ड संरचनाओं का उपयोग किया जाएगा

  • अंतरिक्ष को बचाने के लिए

  • कुछ प्रोटोकॉल का उपयोग करके नेटवर्क पर संचारित करने के लिए एक डेटा संरचना को प्रारूपित करना (यह पाठ्यक्रम का अच्छा अभ्यास नहीं है क्योंकि आपको
    धीरज से निपटने की आवश्यकता है )


5

पैडिंग और पैकिंग एक ही चीज़ के दो पहलू हैं:

  • पैकिंग या संरेखण वह आकार होता है, जिसके प्रत्येक सदस्य को गोलाकार किया जाता है
  • पैडिंग संरेखण से मेल खाने के लिए जोड़ा गया अतिरिक्त स्थान है

में mystruct_A, 4 की एक डिफ़ॉल्ट संरेखण संभालने, प्रत्येक सदस्य 4 बाइट की एक बहु पर गठबंधन है। चूँकि 1 का आकार char1 के लिए पैडिंग है aऔर c4 - 1 = 3 बाइट है, जबकि कोई पैडिंग आवश्यक नहीं है int bजिसके लिए पहले से ही 4 बाइट्स हैं। यह उसी तरह से काम करता है mystruct_B


1

संरचना पैकिंग केवल तब की जाती है जब आप संरचना को पैक करने के लिए स्पष्ट रूप से अपने संकलक को बताते हैं। पैडिंग वह है जो आप देख रहे हैं। आपका 32-बिट सिस्टम शब्द संरेखण के लिए प्रत्येक क्षेत्र को पैडिंग कर रहा है। यदि आपने संरचनाओं को पैक करने के लिए अपने संकलक को बताया था, तो वे क्रमशः 6 और 5 बाइट्स होंगे। हालांकि ऐसा मत करो। यह पोर्टेबल नहीं है और कंपाइलर बहुत धीमा (और कभी-कभी छोटी गाड़ी) कोड भी बनाता है।


1

इसके बारे में कोई नहीं हैं! जो विषय को समझना चाहते हैं, उन्हें निम्न कार्य करने होंगे:


1

पैडिंग के नियम:

  1. संरचना का प्रत्येक सदस्य अपने आकार से विभाज्य पते पर होना चाहिए। पैडिंग तत्वों के बीच या इस नियम को पूरा करने के लिए संरचना के अंत में डाला जाता है। यह हार्डवेयर द्वारा आसान और अधिक कुशल बस पहुंच के लिए किया जाता है।
  2. संरचना के सबसे बड़े सदस्य के आकार के आधार पर संरचना के अंत में पैडिंग का निर्णय लिया जाता है।

क्यों नियम 2: निम्नलिखित संरचना पर विचार करें,

संरचना 1

यदि हम इस संरचना की एक सरणी (2 स्ट्रक्चर्स) बनाने के लिए थे, तो अंत में कोई पेडिंग की आवश्यकता नहीं होगी:

संरचना 1 सरणी

इसलिए, संरचना का आकार = 8 बाइट्स

हम नीचे के रूप में एक और संरचना बनाने के लिए मान रहे थे:

संरचना २

यदि हम इस संरचना की एक सरणी बनाने के लिए थे, तो अंत में आवश्यक पैडिंग के बाइट्स की संख्या की 2 संभावनाएं हैं।

A. अगर हम अंत में 3 बाइट्स जोड़ते हैं और इसे इंट के लिए संरेखित करते हैं और लंबे समय तक नहीं करते हैं:

Struct2 सरणी int के लिए संरेखित

B. यदि हम अंत में 7 बाइट्स जोड़ते हैं और इसे लंबे समय तक संरेखित करते हैं:

स्ट्रक्चर 2 सरणी को लॉन्ग से जोड़ा गया है

दूसरे सरणी का प्रारंभ पता 8 का बहु गुणक है (अर्थात 24)। संरचना का आकार = 24 बाइट्स

इसलिए, संरचना के अगले सरणी के प्रारंभ पते को सबसे बड़े सदस्य के कई में से जोड़कर (अर्थात यदि हम इस संरचना का एक सरणी बनाना चाहते हैं, तो दूसरे सरणी के पहले पते को एक पते पर शुरू करना होगा जो कि एक से अधिक है संरचना के सबसे बड़े सदस्य में। यहां यह 24 (3 * 8) है, हम अंत में आवश्यक पैडिंग बाइट की संख्या की गणना कर सकते हैं।


-1

डेटा संरचना संरेखण वह तरीका है जिससे डेटा को कंप्यूटर मेमोरी में व्यवस्थित और एक्सेस किया जाता है। इसमें दो अलग-अलग लेकिन संबंधित मुद्दे होते हैं: डेटा संरेखण और डेटा संरचना पैडिंग । जब एक आधुनिक कंप्यूटर मेमोरी एड्रेस से पढ़ता है या लिखता है, तो यह शब्द के आकार के विखंडू में ऐसा करेगा (जैसे कि 32-बिट सिस्टम पर 4 बाइट का हिस्सा) या बड़ा। डेटा एलाइनमेंट का अर्थ है कि डेटा को मेमोरी एड्रेस में कुछ मल्टीपल वर्ड साइज के बराबर रखना, जो सीपीयू मेमोरी को हैंडल करने के तरीके के कारण सिस्टम के प्रदर्शन को बढ़ाता है। डेटा को संरेखित करने के लिए, अंतिम डेटा संरचना के अंत और अगले की शुरुआत के बीच कुछ अर्थहीन बाइट्स डालना आवश्यक हो सकता है, जो डेटा संरचना पैडिंग है।

  1. मेमोरी में डेटा को संरेखित करने के लिए, मेमोरी के पते के बीच एक या अधिक खाली बाइट्स (पते) डाले जाते हैं (या खाली छोड़ दिए जाते हैं) जो स्मृति आवंटन के दौरान अन्य संरचना सदस्यों के लिए आवंटित किए जाते हैं। इस अवधारणा को संरचना पैडिंग कहा जाता है।
  2. कंप्यूटर प्रोसेसर का आर्किटेक्चर एक ऐसा तरीका है कि यह एक समय में मेमोरी से 1 शब्द (32 बिट प्रोसेसर में 4 बाइट) पढ़ सकता है।
  3. प्रोसेसर के इस लाभ का उपयोग करने के लिए, डेटा को हमेशा 4 बाइट पैकेज के रूप में संरेखित किया जाता है, जो अन्य सदस्य के पते के बीच खाली पते सम्मिलित करता है।
  4. सी में इस संरचना की गद्दी की अवधारणा के कारण, संरचना का आकार हमेशा वैसा नहीं होता जैसा हम सोचते हैं।

1
आपको अपने उत्तर में एक ही लेख से 5 बार लिंक करने की आवश्यकता क्यों है ? कृपया उदाहरण के लिए केवल एक लिंक रखें। इसके अलावा, चूंकि आप अपने लेख से लिंक कर रहे हैं, इसलिए आपको उस तथ्य का खुलासा करना होगा।
आर्टजोम बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.