Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C और C++ में वेरिएबल-लेंथ सरणी (Variable Length Arrays)

वेरिएबल-लेंथ सरणी (VLA) एक ऐसी सरणी है जिसका आकार कंपाइल टाइम के बजाय रनटाइम पर निर्धारित होता है।

C में VLA समर्थन

  • C99 मानक: VLA का समर्थन करता है
  • C11 मानक: VLA वैकल्पिक बना दिया गया (__STDC_NO_VLA__ मैक्रो जांचें)
  • स्टैक पर आवंटित (आमतौर पर)
  • स्कोप समाप्त होने पर स्वचालित रूप से मुक्त

C में VLA उदाहरण

void make_arr(int n) {
    int array[n];  // VLA - आकार रनटाइम पर ज्ञात
    // array उपयोग करें
}

int main() {
    make_arr(10);  // 10 इंटीजर्स की सरणी बनाता है
    return 0;
}

C++ में VLA समर्थन

  • C++11 और पहले: **कोई VLA समर्थन नहीं**। सरणी आकार एक स्थिर-अभिव्यक्ति (constant-expression) होना चाहिए
  • C++14: सरणी आकार "सरल अभिव्यक्ति" (simple expression) हो सकती है, लेकिन पूर्ण VLA नहीं
  • C++20/23: अभी भी कोई मानक VLA नहीं
  • GCC/Clang एक्सटेंशन के रूप में C++ में VLA समर्थन करते हैं (-pedantic चेतावनी देता है)

C++ में विकल्प

विधिविवरण
std::vectorडायनामिक सरणी, स्वचालित मेमोरी प्रबंधन (अनुशंसित)
std::unique_ptr<T[]>स्मार्ट पॉइंटर से डायनामिक सरणी
new T[n] / delete[]मैन्युअल डायनामिक आवंटन
std::arrayकंपाइल-टाइम आकार की निश्चित सरणी

उदाहरण: C++ में डायनामिक स्ट्रक्चर (फ्लेक्सिबल सरणी सदस्य)

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

struct Employee {
    int id;
    int name_length;
    int struct_size;
    char emp_name[];  // फ्लेक्सिबल सरणी सदस्य (C99, C++ में गैर-मानक एक्सटेंशन)
};

Employee* make_emp(int id, const char arr[]) {
    size_t len = strlen(arr);
    // स्ट्रक्चर + नाम के लिए मेमोरी आवंटित करें
    Employee* e = (Employee*)malloc(sizeof(Employee) + len + 1);
    e->id = id;
    e->name_length = len;
    strcpy(e->emp_name, arr);
    e->struct_size = sizeof(Employee) + len + 1;
    return e;
}

void disp_emp(Employee* e) {
    cout << "Emp Id: " << e->id << endl;
    cout << "Emp Name: " << e->emp_name << endl;
    cout << "Name Length: " << e->name_length << endl;
    cout << "Allocated: " << e->struct_size << endl;
    cout << "---------------------------------------" << endl;
}

int main() {
    Employee *e1 = make_emp(101, "Jayanta Das");
    Employee *e2 = make_emp(201, "Tushar Dey");
    
    disp_emp(e1);
    disp_emp(e2);
    
    cout << "Size of Employee: " << sizeof(Employee) << endl;
    cout << "Size of Employee pointer: " << sizeof(e1) << endl;
    
    free(e1);
    free(e2);
    return 0;
}

आउटपुट

Emp Id: 101
Emp Name: Jayanta Das
Name Length: 11
Allocated: 23
---------------------------------------
Emp Id: 201
Emp Name: Tushar Dey
Name Length: 10
Allocated: 22
---------------------------------------
Size of Employee: 12
Size of Employee pointer: 8

VLA चेतावनियां

  • स्टैक ओवरफ्लो: बड़े VLAs स्टैक को समाप्त कर सकते हैं
  • कोई बाउंड चेकिंग नहीं: प्रोग्रामर की जिम्मेदारी
  • पोर्टेबिलिटी: C11+ में वैकल्पिक, C++ में मानक नहीं
  • प्रदर्शन: छोटी सरणियों के लिए तेज़, बड़ी के लिए malloc बेहतर

सर्वोत्तम अभ्यास

  • C में: छोटी, स्कोप-सीमित सरणियों के लिए VLA उपयोग करें; बड़ी/दीर्घकालिक के लिए malloc
  • C++ में: std::vector प्राथमिकता दें
  • हमेशा आवंटन सफलता जांचें
  1. C/C++ में मल्टीडायमेंशनल ऐरे C/C++ में मल्टीडायमेंशनल ऐरे

    C/C++ में, मल्टीडायमेंशनल ऐरे को सरल शब्दों में ऐरे के ऐरे के रूप में परिभाषित किया जाता है। मल्टीडायमेंशनल ऐरे में डेटा टेबुलर फॉर्म में स्टोर होता है (रो मेजर ऑर्डर में)। निम्नलिखित डायग्राम 3 x 3 x 3 डायमेंशन वाले मल्टीडायमेंशनल ऐरे के लिए मेमोरी आवंटन रणनीति दिखाता है। एल्गोरिदम Begin ऐर

  1. C++ में वृत्त और आयत के ओवरलैप की जांच C++ में वृत्त और आयत के ओवरलैप की जांच

    मान लीजिए हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) से दर्शाया जाता है, जहां (xc, yc) केंद्र के निर्देशांक हैं। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) से दर्शाया जाता है, जहां (x1, y1) निचले-बाएं कोने के निर्देशांक हैं और (x2, y2) ऊपरी-दाएं कोने के निर्देशांक हैं। हमें जांचना

  1. C++ में डोमिनो और ट्रोमिनो टाइलिंग C++ में डोमिनो और ट्रोमिनो टाइलिंग

    मान लीजिए हमारे पास दो प्रकार के आकार हैं, डोमिनो और ट्रोमिनो। उन्हें नीचे दिखाए अनुसार घुमाया जा सकता है:एक टाइलिंग में, प्रत्येक वर्ग को एक टाइल द्वारा कवर किया जाना चाहिए। यहां दो टाइलिंग तभी अलग हैं जब बोर्ड पर दो 4-दिशात्मक आसन्न सेल हों जैसे कि उन टाइलिंग में से केवल एक में दोनों वर्ग एक टाइल