C-তে malloc-এর ফলাফল কাস্ট করা কি প্রয়োজনীয়?

C-তে malloc-এর ফলাফল কাস্ট করা কি প্রয়োজনীয়?
C-তে malloc-এর ফলাফল কাস্ট করা কি প্রয়োজনীয়?

C-তে malloc এবং Casting বোঝা

সি প্রোগ্রামিং-এ, গতিশীল মেমরি বরাদ্দ প্রায়ই `ম্যালোক` ফাংশন ব্যবহার করে পরিচালিত হয়। বিকাশকারীদের মধ্যে একটি সাধারণ বিতর্ক হল একটি পয়েন্টারে বরাদ্দ করার সময় `malloc` এর ফলাফল কাস্ট করতে হবে কিনা। উদাহরণ স্বরূপ, `int *চালনী = (Int *)malloc(sizeof(*seveof) * length);` এর পরিবর্তে `int *চালনী = malloc(sizeof(*seve) * length);` ব্যবহার করা কি ভালো?

এই নিবন্ধটি 'ম্যালোক' ফলাফলের কাস্ট এড়ানোর পিছনে যুক্তির সন্ধান করে। আমরা উভয় পদ্ধতির প্রভাবগুলি অন্বেষণ করব এবং কেন একটিকে অন্যটির চেয়ে পছন্দ করা যেতে পারে সে সম্পর্কে স্পষ্টতা প্রদান করব। এই সূক্ষ্মতা বোঝা আপনার সি প্রোগ্রামিং অনুশীলন উন্নত করতে সাহায্য করতে পারে।

আদেশ বর্ণনা
malloc মেমরির একটি নির্দিষ্ট সংখ্যক বাইট বরাদ্দ করে এবং বরাদ্দ করা মেমরিতে একটি পয়েন্টার ফেরত দেয়।
sizeof একটি পরিবর্তনশীল বা ডেটা টাইপের বাইটে আকার নির্ধারণ করে।
fprintf একটি নির্দিষ্ট স্ট্রিমে একটি ফর্ম্যাট করা স্ট্রিং প্রিন্ট করে, যেমন stderr।
perror শেষ ত্রুটির উপর ভিত্তি করে stderr-এ একটি বর্ণনামূলক ত্রুটি বার্তা প্রিন্ট করে।
EXIT_FAILURE ম্যাক্রো যা ব্যর্থ প্রোগ্রাম সমাপ্তি নির্দেশ করে।
free পূর্বে বরাদ্দ করা মেমরি ডিঅলোকেট করে।

সি-তে ম্যালোক এবং মেমরি ম্যানেজমেন্টে গভীরভাবে ডুব দিন

প্রথম স্ক্রিপ্টে আমরা এর ব্যবহার দেখতে পাই malloc একটি পূর্ণসংখ্যা অ্যারের জন্য গতিশীলভাবে মেমরি বরাদ্দ করতে। বিবৃতি int *sieve = malloc(sizeof(*sieve) * length); পূর্ণসংখ্যার 'দৈর্ঘ্য' সংখ্যার জন্য মেমরির অনুরোধ করে। ব্যবহার করে sizeof(*sieve), আমরা নিশ্চিত করি যে পয়েন্টার প্রকার নির্বিশেষে সঠিক পরিমাণ মেমরি বরাদ্দ করা হয়েছে। এই পদ্ধতি ফলাফল ঢালাই জন্য প্রয়োজন এড়ায় malloc. মেমরি বরাদ্দ ব্যর্থ হলে, প্রোগ্রাম ব্যবহার করে fprintf(stderr, "Memory allocation failed\n"); স্ট্যান্ডার্ড এরর স্ট্রীমে একটি ত্রুটি বার্তা প্রিন্ট করতে এবং তারপর একটি অ-শূন্য স্থিতি সহ প্রস্থান করুন। বরাদ্দকৃত মেমরি 1 থেকে 'দৈর্ঘ্য' পর্যন্ত পূর্ণসংখ্যা সংরক্ষণ করতে ব্যবহৃত হয় এবং পরে এটি ব্যবহার করে মুক্ত হওয়ার আগে মুদ্রিত হয় free(sieve);.

দ্বিতীয় স্ক্রিপ্টে, আমরা একটি অনুরূপ কাঠামো অনুসরণ করি কিন্তু পরিবর্তে ডাবলের অ্যারের জন্য মেমরি বরাদ্দ করি। লাইন double *array = malloc(sizeof(*array) * length); দ্বিগুণ সংখ্যার 'দৈর্ঘ্য'-এর জন্য মেমরি বরাদ্দ করে। বরাদ্দ ব্যর্থ হলে, perror ফাংশন একটি বর্ণনামূলক ত্রুটি বার্তা প্রিন্ট করে এবং প্রোগ্রামটি এর সাথে প্রস্থান করে EXIT_FAILURE. বরাদ্দ করা মেমরি দ্বিগুণ মান সংরক্ষণ করতে ব্যবহৃত হয়, যা জোড় সংখ্যায় শুরু হয়। এই মানগুলি প্রিন্ট করা হয়, এবং অবশেষে, মেমরি ব্যবহার করে মুক্ত করা হয় free(array);. উভয় স্ক্রিপ্টের সাফল্য পরীক্ষা করার গুরুত্ব প্রদর্শন করে malloc এবং এর সঠিক ব্যবহার free মেমরি লিক এড়াতে.

সি-তে malloc এর সঠিক ব্যবহার বোঝা

সি প্রোগ্রামিং

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

int main() {
    int length = 10;
    int *sieve = malloc(sizeof(*sieve) * length);
    if (sieve == ) {
        fprintf(stderr, "Memory allocation failed\\n");
        return 1;
    }

    for (int i = 0; i < length; i++) {
        sieve[i] = i + 1;
    }

    for (int i = 0; i < length; i++) {
        printf("%d ", sieve[i]);
    }
    printf("\\n");

    free(sieve);
    return 0;
}

সি-তে কাস্টিং ছাড়াই মেমরি অ্যালোকেশন অন্বেষণ করা

সি প্রোগ্রামিং

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

int main() {
    int length = 5;
    double *array = malloc(sizeof(*array) * length);
    if (array == ) {
        perror("Failed to allocate memory");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < length; i++) {
        array[i] = i * 2.0;
    }

    for (int i = 0; i < length; i++) {
        printf("%f\\n", array[i]);
    }

    free(array);
    return 0;
}

সি-তে মেমরি বরাদ্দের সূক্ষ্মতা

সি-তে মেমরি বরাদ্দের আরেকটি গুরুত্বপূর্ণ দিক হল এর মধ্যে পার্থক্য বোঝা malloc এবং অন্যান্য মেমরি বরাদ্দকরণ ফাংশন যেমন calloc এবং realloc. যখন malloc এটি শুরু না করেই মেমরির একটি ব্লক বরাদ্দ করে, calloc উভয়ই মেমরি ব্লককে শূন্যে বরাদ্দ করে এবং শুরু করে। এটি নির্দিষ্ট ধরণের বাগগুলিকে প্রতিরোধ করতে পারে যা শুরু না করা মেমরি ব্যবহার করার ফলে উদ্ভূত হয়। এই ক্ষেত্রে, int *arr = calloc(length, sizeof(*arr)); নিশ্চিত করে যে সমস্ত উপাদান শূন্য-প্রাথমিক, যা আপনার যখন একটি পরিষ্কার স্লেট প্রয়োজন তখন দরকারী।

অন্য দিকে, realloc একটি বিদ্যমান মেমরি ব্লকের আকার পরিবর্তন করতে ব্যবহৃত হয়। আপনি যদি একটি বরাদ্দকৃত মেমরি ব্লকের আকার পরিবর্তন করতে চান, realloc একটি নতুন ব্লক বরাদ্দ করা এবং বিষয়বস্তু অনুলিপি করার চেয়ে আরও কার্যকর বিকল্প হতে পারে। উদাহরণ স্বরূপ, arr = realloc(arr, new_length * sizeof(*arr)); দ্বারা নির্দেশিত মেমরি ব্লকের আকার সামঞ্জস্য করে arr মিটমাট করা new_length উপাদান যাইহোক, এটি পরিচালনা করা গুরুত্বপূর্ণ realloc সাবধানে মেমরি লিক বা মূল মেমরি ব্লক হারানো এড়াতে যদি realloc ব্যর্থ হয়

C-তে malloc সম্পর্কে সাধারণ প্রশ্ন ও উত্তর

  1. কি করে malloc জন্য দাঁড়ানো?
  2. malloc "মেমরি বরাদ্দ" এর জন্য দাঁড়িয়েছে।
  3. কেন আমরা ফলাফল পরীক্ষা করা উচিত malloc?
  4. আমরা ফলাফল পরীক্ষা malloc মেমরি বরাদ্দ সফল হয়েছে তা নিশ্চিত করতে এবং একটি নাল পয়েন্টার ডিরেফারেন্সিং এড়াতে।
  5. হলে কি হবে malloc ব্যর্থ হয়?
  6. যদি malloc ব্যর্থ হলে, এটি একটি নাল পয়েন্টার প্রদান করে, যা অনির্ধারিত আচরণ প্রতিরোধ করতে চেক করা উচিত।
  7. করতে পারা malloc পর্যাপ্ত মেমরি উপলব্ধ থাকলেও একটি নাল পয়েন্টার ফিরিয়ে দিন?
  8. হ্যাঁ, ফ্র্যাগমেন্টেশনের মতো অন্যান্য কারণ হতে পারে malloc ব্যর্থ।
  9. এর মধ্যে পার্থক্য কী malloc এবং calloc?
  10. malloc শুরু না করা মেমরি বরাদ্দ করে, যখন calloc বরাদ্দ করে এবং মেমরিকে শূন্য করে আরম্ভ করে।
  11. কিভাবে করে realloc কাজ?
  12. realloc একটি বিদ্যমান মেমরি ব্লকের আকার পরিবর্তন করে, বিষয়বস্তুগুলিকে নতুন আকার বা আসল আকার পর্যন্ত সংরক্ষণ করে, যেটি ছোট হয়।
  13. এটি দ্বারা বরাদ্দ মেমরি বিনামূল্যে প্রয়োজন malloc?
  14. হ্যাঁ, মেমরি মুক্ত করতে ব্যর্থ হলে মেমরি লিক হয়ে যায়, যা সময়ের সাথে সাথে সিস্টেম মেমরিকে নিঃশেষ করে দিতে পারে।

malloc কাস্টিং এর মূল উপায়:

উপসংহারে, ফলাফল ঢালাই malloc সি এর প্রয়োজন নেই এবং কম পঠনযোগ্য কোড এবং সম্ভাব্য ত্রুটি হতে পারে। কাস্ট বাদ দিয়ে, আমরা C মান মেনে চলি এবং C++ কম্পাইলারের সাথে সামঞ্জস্য বজায় রাখি। সর্বদা ফলাফল পরীক্ষা করুন malloc সফল মেমরি বরাদ্দ নিশ্চিত করতে, এবং লিক এড়াতে বরাদ্দ করা মেমরি মুক্ত করতে ভুলবেন না। এই অনুশীলনগুলি আরও শক্তিশালী এবং রক্ষণাবেক্ষণযোগ্য সি কোডে অবদান রাখে, সামগ্রিক প্রোগ্রামের স্থিতিশীলতা বাড়ায়।