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

C भाषा में डायनामिक मेमोरी आवंटन का उदाहरण


समस्या

उपयोगकर्ता द्वारा दर्ज n संख्याओं का योग डायनामिक मेमोरी आवंटन से ज्ञात करना।

फंक्शन्स अवलोकन

  • malloc() - बाइट्स में ब्लॉक आवंटित
  • calloc() - सन्निहित शून्य-प्रारंभिकृत ब्लॉक
  • realloc() - आकार बढ़ाएं/घटाएं
  • free() - मेमोरी मुक्त करें

पूर्ण प्रोग्राम: योग और free() प्रदर्शन

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, *arr, sum = 0;
    
    printf("तत्वों की संख्या: ");
    scanf("%d", &n);
    
    if (n <= 0) {
        printf("अमान्य संख्या\n");
        return 1;
    }
    
    // malloc से आवंटन
    arr = malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("मेमोरी उपलब्ध नहीं\n");
        return 1;
    }
    
    // इनपुट और योग साथ-साथ
    printf("%d तत्व दर्ज करें:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
        sum += arr[i];
    }
    
    printf("तत्वों का योग: %d\n", sum);
    
    // free() के बाद मेमोरी एक्सेस (प्रदर्शन के लिए)
    free(arr);
    printf("\nfree() के बाद मेमोरी सामग्री (कचरा मान):\n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);  // अपरिभाषित व्यवहार! केवल प्रदर्शन
    printf("\n");
    
    return 0;
}

आउटपुट

तत्वों की संख्या: 5
5 तत्व दर्ज करें:
23 34 12 34 56
तत्वों का योग: 159

free() के बाद मेमोरी सामग्री (कचरा मान):
12522624 0 12517712 0 56

महत्वपूर्ण चेतावनी

⚠ free() के बाद एक्सेस = अपरिभाषित व्यवहार

उपरोक्त प्रोग्राम में free(arr) के बाद arr[i] एक्सेस केवल प्रदर्शन के लिए है। वास्तविक कोड में कभी न करें। इससे क्रैश, डेटा भ्रष्टाचार, या सुरक्षा छेद हो सकता है।

सुधारित संस्करण: realloc() प्रदर्शन


#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = NULL;
    int capacity = 0, size = 0, val;
    
    printf "संख्याएँ दर्ज करें (0 से समाप्त):\n";
    while (scanf("%d", &val) == 1 && val != 0) {
        if (size >= capacity) {
            capacity = capacity ? capacity * 2 : 4;
            int *tmp = realloc(arr, capacity * sizeof(int));
            if (!tmp) { free(arr); return 1; }
            arr = tmp;
        }
        arr[size++] = val;
    }
    
    int sum = 0;
    for (int i = 0; i < size; i++) sum += arr[i];
    printf("कुल %d संख्याओं का योग: %d\n", size, sum);
    
    free(arr);
    return 0;
}

calloc() vs malloc()


// malloc - अनारंभिकृत
int *a = malloc(10 * sizeof(int));  // कचरा मान

// calloc - शून्य-प्रारंभिकृत
int *b = calloc(10, sizeof(int));   // सभी 0
// calloc(n, size) = malloc(n*size) + memset(0)

स्मार्ट पॉइंटर पैटर्न (C में अनुकरण)


#define AUTO_FREE __attribute__((cleanup(free_ptr)))
void free_ptr(void *p) { free(*(void**)p); }

int main() {
    AUTO_FREE int *arr = malloc(100 * sizeof(int));
    // फंक्शन अंत पर स्वतः free() कॉल होगा
}

(GCC/Clang एक्सटेंशन; C23 में मानक विशेषता संभावित)

  1. jQuery closest() मेथड उदाहरण के साथ jQuery closest() मेथड उदाहरण के साथ

    jQuery में closest() मेथड का उपयोग चयनित तत्व के पहले पूर्वज (ancestor) को लौटाने के लिए किया जाता है। सिंटैक्स सिंटैक्स इस प्रकार है: $(selector).closest(filter) उदाहरण आइए अब jQuery closest() मेथड को लागू करने का एक उदाहरण देखें: <!DOCTYPE html> <html> <head> <style>

  1. गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग गूगल TCMalloc के साथ रूबी की मेमोरी आवंटन प्रोफाइलिंग

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी मेमोरी को चंक्स में प्राप्त करता है, जिन्हें पेज कहा जाता है, नए ऑब्जेक्ट्स यहां सहेजे जाते हैं। फिर… जब ये पेज भर जाते हैं, तो अधिक मेमोरी की आवश्यकता होती है। रूबी malloc फंक्शन के साथ ऑपरेटिंग सिस्टम से अधिक मेमोरी का अनुरोध करता है। यह malloc फंक्शन ऑ

  1. Redis GEORADIUSBYMEMBER का उपयोग: उदाहरणों के साथ व्यावहारिक गाइड Redis GEORADIUSBYMEMBER का उपयोग: उदाहरणों के साथ व्यावहारिक गाइड

    GEORADIUSBYMEMBER कमांड यह कमांड की पर संग्रहीत जियोस्पेशियल मान (सॉर्टेड सेट) के एक या अधिक मेंबर्स को लौटाने के लिए उपयोग किया जाता है, जो निर्दिष्ट मेंबर के लॉन्गिट्यूड, लैटिट्यूड मान को सर्कल के केंद्र स्थान के रूप में और निर्दिष्ट यूनिट में रेडियस को सर्कल की त्रिज्या के रूप में उपयोग करके गणना