কম্পিউটার টিউটোরিয়াল

সি-তে হিপ ওভারফ্লো এবং স্ট্যাক ওভারফ্লো


হিপ ওভারফ্লো (Heap Overflow)

হিপ (Heap) ডায়নামিক ভেরিয়েবল সংরক্ষণ করতে ব্যবহৃত হয়। এটি প্রসেসের মেমরির একটি অঞ্চল। malloc(), calloc(), realloc() এই সব বিল্ট-ইন ফাংশন সাধারণত ডায়নামিক ভেরিয়েবল সংরক্ষণ করতে ব্যবহৃত হয়।

হিপ ওভারফ্লো ঘটে যখন:

ক) যদি আমরা বড় সংখ্যক ডায়নামিক ভেরিয়েবল অ্যালোকেট করি:

int main() {
    float *ptr = (int *)malloc(sizeof(float)*1000000.0);
}

খ) যদি আমরা liên tục মেমরি অ্যালোকেট করি এবং ব্যবহার করার পর ফ্রি (free) করি না:

int main() {
    for (int i=0; i<100000000000; i++) {
        int *p = (int *)malloc(sizeof(int));
    }
}

স্ট্যাক ওভারফ্লো (Stack Overflow)

স্ট্যাক (Stack) একটি লাস্ট-ইন-ফার্স্ট-আউট (LIFO) ডেটা স্ট্রাকচার। এটি ফাংশনের ভিতরে ব্যবহৃত লোকাল ভেরিয়েবল সংরক্ষণ করতে ব্যবহৃত হয়। প্যারামিটারগুলো এই ফাংশনের মাধ্যমে পাস করা হয় এবং তাদের রিটার্ন অ্যাড্রেসও।

যদি একটি প্রোগ্রাম অধিক মেমরি স্পেস খরচ করে, তবে স্ট্যাক ওভারফ্লো ঘটবে কারণ কম্পিউটার মেমরিতে স্ট্যাকের আকার সীমিত।

স্ট্যাক ওভারফ্লো ঘটে যখন:

গ) যদি একটি ফাংশন নিজেই রিকার্সিভলি অনন্তবার কল করা হয়: তখন স্ট্যাক বড় সংখ্যক লোকাল ভেরিয়েবল সংরক্ষণ করতে অক্ষম হবে, ফলে স্ট্যাক ওভারফ্লো হবে।

void calculate(int a) {
    if (a == 0)
        return;
    a = 6;
    calculate(a);
}

int main() {
    int a = 5;
    calculate(a);
}

ঘ) যদি আমরা বড় সংখ্যক লোকাল ভেরিয়েবল ঘোষণা করি বা বড় ডাইমেনশনাল অ্যারে বা ম্যাট্রিক্স ঘোষণা করি: ফলে স্ট্যাক ওভারফ্লো হতে পারে।

int main() {
    int A[20000][20000];
}
  1. স্ট্যাক এবং হিপের পার্থক্য

  2. C-তে const int*, const int* const, এবং int const* এর পার্থক্য

  3. C প্রোগ্রাম: আয়তের 넓ী ও পরিসীমা (Area & Perimeter of Rectangle)

  4. বৃত্ত ও আয়ত ওভারল্যাপ চেক করা C++-এ