সি পাইথন প্রোগ্রামিং জাভাস্ক্রিপ্ট পিএইচপি এসকিউএল জেকুয়েরি এইচটিএমএল সিএসএস বুটস্ট্রাপ এঙ্গুলার জেএস
লগইন
×

 সি টিউটোরিয়াল

সি প্রোগ্রামিং কি? সি এর ইতিহাস সি এর বৈশিষ্ট্যসমূহ কেন সি শিখবেন? সি ইন্সটলেশন প্রথম সি প্রোগ্রাম সি প্রোগ্রামের ফ্লো প্রোগ্রামিং শেখার সঠিক পদ্ধতি সি কীওয়ার্ড সি আইডেন্টিফায়ার সি ভ্যারিয়েবল সি কনস্ট্যান্ট সি ডাটা টাইপ সি মোডিফায়ার সি ইনপুট/আউটপুট সি অপারেটর সি কমেন্ট সি অপারেটর অগ্রাধিকার

সি কন্ট্রোল স্টেটমেন্ট

সি ইফ সি ইফ...ইলস সি ফর লুপ সি হোহাইল লুপ সি ডু...হোহাইল লুপ সি ব্রেক সি কন্টিনিউ সি সুইচ স্টেটমেন্ট সি goto স্টেটমেন্ট

 সি ফাংশন

সি ফাংশন পরিচিতি সি ইউজার কর্তৃক ফাংশন সি ফাংশন টাইপ সি রিকার্সন সি ভ্যারিয়েবল স্কোপ

 সি অ্যারে

সি অ্যারে পরিচিতি সি মালটি-ডাইমেনশনাল অ্যারে সি অ্যারে ফাংশন

 সি স্ট্রিং

সি স্ট্রিং সি স্ট্রিং ফাংশন

 সি পয়েন্টার

সি পয়েন্টার পরিচিত সি পয়েন্টার অ্যারে সি পয়েন্টার ফাংশন সি মেমোরি ম্যানেজমেন্ট

 সি ফাইল এবং স্ট্রাকচার

স্ট্রাকচার পরিচিত স্ট্রাকচার ও পয়েন্টার সি স্ট্রাকচার ও ফাংশন সি ইউনিয়ন ফাইল হ্যান্ডেলিং

 সি অতিরিক্ত টিউটোরিয়াল

সি লাইব্রেরী সি প্রিপ্রোসেসর এবং ম্যাক্রো সি ইনুমিরেশন সি এরর নিয়ন্ত্রণ সি টাইপ কাস্টিং সি বিট ফিল্ড সি ভ্যারিয়েবল আর্গুমেন্ট সি কমান্ড লাইন আর্গুমেন্ট

 

সি ডাইনামিক মেমোরি এলোকেশন | C Dynamic Memory Allocation


এই অধ্যায়ে আপনি স্টান্ডার্ড লাইব্রেরী ফাংশন malloc(), calloc(), free() এবং realloc() ব্যবহার করে আপনার প্রোগ্রামে ডাইনামিকভাবে মেমোরি বরাদ্দ(dynamically allocate memory) করা শিখবেন।

সি প্রোগ্রামিং এ, কম্পাইল টাইমে না যাওয়া পর্যন্ত array এর সাইজ অজানা থাকে। অর্থাৎ ঐ সময় পর্যন্ত যতক্ষণ না কম্পাইলার আপনার কোডকে কম্পিউটার বুঝে এমন কোডে এ(language ) রূপান্তর করে। সুতরাং মাঝে মাঝে array এর সাইজ(size) কম অথবা প্রয়োজনের তুলনায় বেশিও হতে পারে।

ডাইনামিক মেমোরি এ লোকেশন(Dynamic memory allocation) আপনার প্রোগ্রাম রান(run) করার সময় হয় অধিক মেমোরি ধরে রাখে অথবা প্রয়োজন না হলে ছেড়ে দেয়।

সহজ অর্থে, ডাইনামিক মেমোরি এলোকেশন আপনার প্রোগ্রামের মেমোরি স্পেস মায়লুয়ালি(manually) পরিচালনা করার সম্মতি দেয়।

সি প্রোগ্রামে উত্তরাধিকার সূত্রে মেমোরি বরাদ্দের জন্য ডাইনামিক কোনো কৌশল না থাকলেও হেডার ফাইল "stdlib.h" এর অধীনে ডাইনামিকভাবে মেমোরি এলোকেশন এর জন্য ৪টি লাইব্রেরী ফাংশন রয়েছে।

ফাংশন ফাংশনের ব্যবহার
malloc() অনুরোধের ভিত্তিতে মেমোরি স্পেস বরাদ্দ করে এবং বরাদ্দ করা মেমোরির প্রথম বাইটের জন্য পয়েন্টার রিটার্ন করে।
calloc() Array এর এলিমেন্টের জন্য মেমোরি স্পেস বরাদ্দ করে এবং এর প্রাথমিক ভ্যালু 0(শূন্য) থাকে। তারপরে মেমোরিতে পয়েন্টার রিটার্ন করে।
free() পূর্বের বরাদ্দ করা মেমোরি স্পেস মুক্ত/খালি করে।
realloc() পূর্বের বরাদ্দ করা মেমোরি স্পেসের পরিবর্তন ঘটায়।

সি  malloc() ফাংশন

malloc এর পূর্ণরূপ "memory allocation"।

malloc() ফাংশন মেমোরির একটি নির্দিষ্ট জাইগা(bolck) দখল করে এবং void টাইপের pointer রিটার্ন করে যার মাধ্যমে যেকোনো আকৃতির(from) পয়েন্টার নিক্ষেপ(cast) হতে পারে।

malloc() এর সিনট্যাক্স

ptr = (cast-type*) malloc(byte-size)

এখানে ptr হলো নিক্ষেপ(cast) টাইপের পয়েন্টার। malloc() ফাংশন মেমোরির মধ্যে বাইট এককে নির্দিষ্ট সাইজের একটি পয়েন্টার রিটার্ন করে। মেমোরি স্পেস পর্যাপ্ত না হোলে NULL পয়েন্টার রিটার্ন(return) করে।

ptr = (int*) malloc(50 * sizeof(int));

এই স্টেটমেন্টটি int এর সাইজ(২ অথবা ৪ বাইট) এর উপর ভীতিকরে যথাক্রমে ১০০ অথবা ২০০ বাইট মেমোরি বরাদ্দ করতে পারে এবং পয়েন্টার মেমোরির প্রথম বাইটের এড্রেসে রেফার(point) করে।


সি  calloc() ফাংশন

calloc এর পূর্ণরুপ "contiguous allocation"।

malloc() এবং calloc() এর মধ্যে শুধুমাত্র পার্থক্য হলো malloc() ফাংশন মেমোরির সিঙ্গেল ব্লক(single block of memory) বরাদ্দ করে পক্ষান্তরে calloc() ফাংশন মেমোরির মাল্টিপল ব্লক(multiple blocks of memory) বরাদ্দ করে এবং প্রত্যেকের সাইজ সেট হয় 0(শূন্য)।

calloc() এর সিনট্যাক্স

ptr = (cast-type*)calloc(n, element-size);

এই স্টেটমেন্টটি n সংখ্যক এলিমেন্ট বিশিষ্ট array জন্য সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে। উদাহরণস্বরূপঃ

ptr = (float*) calloc(50, sizeof(double));

এই স্টেটমেন্টটি ৫০টি এলিমেন্ট বিশিষ্ট array জন্য double(8 bytes) সাইজের সন্নিহিত(contiguous) মেমোরি স্পেস বরাদ্দ করবে।

সি  free() ফাংশন

calloc() অথবা malloc() ফাংশন কর্তৃক ডাইনামিকভাবে(Dynamically) বরাদ্দ হওয়া মেমোরি নিজে নিজে মুক্ত হতে পারে না। তাই আটককৃত(allocated) মেমোরি খালাস(release) করার জন্য আপনাকে অবশ্যই free() ফাংশন ব্যবহার করতে হবে।

free() সিনট্যাক্স

free(ptr);

এই স্টেটমেন্টটি পয়েন্টার(ptr) কর্তৃক মেমোরিতে বরাদ্দ হওয়া স্পেসকে খালি করে।

উদাহরনঃ সি malloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য malloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

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

int main()
{
    int num, i, *ptr, sum = 0;

    printf("Enter number of elements: ");
    scanf("%d", &num);

    ptr = (int*) malloc(num * sizeof(int));  //malloc ব্যবহার করে মেমোরি বরাদ্দ করা
    if(ptr == NULL)                     
    {
        printf("Error! memory not allocated.");
        exit(0);
    }

    printf("Enter elements of array: ");
    for(i = 0; i < num; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }

    printf("Sum = %d", sum);
    free(ptr);
    return 0;
}

উদাহরনঃ সি calloc() এবং free() ফাংশনের ব্যবহার

ইউজার কর্তৃক ইনপুট নিয়ে n সংখ্যক এলিমেন্টের যোগফল নির্ণয়ের জন্য সি প্রোগ্রাম লিখুন।

এই প্রোগ্রামটি সম্পাদনের জন্য calloc() ফাংশন ব্যবহার করে ডাইনামিকভাবে মেমোরি বরাদ্দ(allocate) করতে হবে।

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

int main()
{
    int num, i, *ptr, sum = 0;
    printf("Enter number of elements: ");
    scanf("%d", &num);

    ptr = (int*) calloc(num, sizeof(int)); //calloc ব্যবহার করে মেমোরি বরাদ্দ করা
    if(ptr == NULL)
    {
        printf("Error! memory not allocated.");
        exit(0);
    }

    printf("Enter elements of array: ");
    for(i = 0; i < num; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }

    printf("Sum = %d", sum);
    free(ptr);
    return 0;
}

সি  realloc() ফাংশন

ইতিমধ্যে বরাদ্দকৃত মেমোরির সাইজ যদি প্রয়োজনের তুলনায় কম বা বেশি হয় তাহলে realloc() ফাংশন ব্যবহার করে আপনি পূর্ববর্তী মেমোরির সাইজ পরিবর্তন করতে পারেন।

realloc() এর সিনট্যাক্স

ptr = realloc(ptr, newsize);

এখানে ptr হলো নতুন সাইজের বরাদ্দ হওয়া মেমোরি।

উদাহরনঃ সি realloc() ফাংশনের ব্যবহার

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

int main()
{
    int *ptr, i , n1, n2;
    printf("Enter size of array: ");
    scanf("%d", &n1);

    ptr = (int*) malloc(n1 * sizeof(int));

    printf("Address of previously allocated memory: ");
    for(i = 0; i < n1; ++i)
         printf("%u\t",ptr + i);

    printf("\nEnter new size of array: ");
    scanf("%d", &n2);
    ptr = realloc(ptr, n2);
    for(i = 0; i < n2; ++i)
         printf("%u\t", ptr + i);
    return 0;
}