Arrays — Contiguous Memory

পাশাপাশি সাজানো মেমরির সম্ভাবনা ও বিপদ

~30 min Intermediate 18 practice problems Live code

1. What Is an Array?

An array is a block of adjacent memory holding elements of the same type. If you declare int a[5];, you get five int-sized slots placed side by side in RAM.

Array হলো একই type-এর কয়েকটি value পাশাপাশি সাজানো memory। int a[5]; ঘোষণা করলে memory-তে পরপর ৫টি int-size জায়গা বরাদ্দ হয়।
10 20 30 40 50 a[0] a[1] a[2] a[3] a[4] 0x100 0x104 0x108 0x10C 0x110 int a[5] = {10, 20, 30, 40, 50}; Figure 13.1 — একটি 5-element int array-এর memory layout (4-byte int ধরে)।

2. Declaration & Initialization

int a[5];                  // uninitialized — garbage values!
int b[5] = {1, 2, 3};     // rest are zero-filled
int c[]  = {1, 2, 3, 4};  // size inferred as 4
int d[10] = {0};           // classic "all zeros" idiom
int e[5] = {[2] = 100};    // designated initializer (C99)

3. Access via Index

array_basics.c
#include <stdio.h>

int main(void) {
    int a[5] = {10, 20, 30, 40, 50};

    printf("first = %d\n", a[0]);
    printf("last  = %d\n", a[4]);
    printf("size  = %zu bytes (%zu ints)\n",
           sizeof(a), sizeof(a) / sizeof(a[0]));

    for (int i = 0; i < 5; i++)
        printf("a[%d] = %d\n", i, a[i]);
    return 0;
}
C does not check bounds a[5] যখন array-এর সীমার বাইরে, C কোনো error দেবে না — silent undefined behavior। আশেপাশের variable corrupt হতে পারে, security bug তৈরি হতে পারে। -fsanitize=address দিয়ে compile করলে এই ধরনের বাগ দ্রুত ধরা যায়।

4. Arrays Decay to Pointers

যখন array কোনো ফাংশনে পাস করা হয়, তখন শুধু তার প্রথম element-এর address পাঠানো হয় — পুরো array copy হয় না।

decay.c
#include <stdio.h>

void show(int a[], int n) {     // same as int *a, int n
    printf("inside : sizeof = %zu\n", sizeof(a));  // pointer size!
    for (int i = 0; i < n; i++) printf("%d ", a[i]);
    putchar('\n');
}

int main(void) {
    int x[5] = {1, 2, 3, 4, 5};
    printf("outside: sizeof = %zu\n", sizeof(x));   // full array size
    show(x, 5);
    return 0;
}
Function-এর ভেতরে sizeof(a) আসলে pointer-এর size (সাধারণত 8 byte), array-এর না। তাই ফাংশনে array পাঠানোর সময় সবসময় length আলাদাভাবে পাঠাতে হবে।

5. 2D & Multi-Dimensional Arrays

matrix.c
#include <stdio.h>

int main(void) {
    int mat[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++)
            printf("%3d ", mat[i][j]);
        putchar('\n');
    }
    return 0;
}
C 2D array সংরক্ষণ করে row-major order-এ — অর্থাৎ প্রথম সারির সব element, তারপর দ্বিতীয় সারির, ইত্যাদি। Memory-তে একটি 2D array আসলে পরপর সাজানো একটি 1D array।

6. Variable-Length Arrays (VLA, C99)

void demo(int n) {
    int buf[n];           // size decided at runtime
    ...
}

VLA stack-এ allocate হয়। বড় VLA stack overflow ঘটাতে পারে — এজন্য সাধারণত বড় size-এর জন্য heap (malloc) ভালো।

7. Practice Problems

  1. Read N numbers into an array and print them in reverse.
    N-টি সংখ্যা input নিয়ে reverse order-এ প্রিন্ট করুন।
    ✨ Show Answer
    rev_arr.c — stdin: 5 / 10 20 30 40 50
    #include <stdio.h>
    int main(void) {
        int n; scanf("%d", &n);
        int a[100];
        for (int i = 0; i < n; i++) scanf("%d", &a[i]);
        for (int i = n - 1; i >= 0; i--) printf("%d ", a[i]);
        putchar('\n');
        return 0;
    }
  2. Find min, max and mean of an array.
    Array-এর min, max ও mean বের করুন।
    ✨ Show Answer
    stats.c
    #include <stdio.h>
    int main(void) {
        int a[] = {42, 7, 19, 85, 3, 21};
        int n = sizeof(a) / sizeof(a[0]);
        int mn = a[0], mx = a[0];
        long sum = 0;
        for (int i = 0; i < n; i++) {
            if (a[i] < mn) mn = a[i];
            if (a[i] > mx) mx = a[i];
            sum += a[i];
        }
        printf("min=%d max=%d mean=%.2f\n", mn, mx, (double)sum / n);
        return 0;
    }
  3. Count occurrences of a target value in an array.
    একটি মানের সংখ্যা Array-তে কতবার আছে গুনুন।
    ✨ Show Answer
    count.c
    #include <stdio.h>
    int main(void) {
        int a[] = {3, 5, 3, 7, 3, 2, 3, 9};
        int n = 8, target = 3, count = 0;
        for (int i = 0; i < n; i++) if (a[i] == target) count++;
        printf("%d appears %d times\n", target, count);
        return 0;
    }
  4. Rotate an array left by k positions.
    Array-কে বামে k অবস্থান rotate করুন।
    ✨ Show Answer
    rotate.c
    #include <stdio.h>
    void reverse(int *a, int l, int r) {
        while (l < r) { int t = a[l]; a[l++] = a[r]; a[r--] = t; }
    }
    int main(void) {
        int a[] = {1, 2, 3, 4, 5, 6, 7};
        int n = 7, k = 3;
        reverse(a, 0, k - 1);
        reverse(a, k, n - 1);
        reverse(a, 0, n - 1);
        for (int i = 0; i < n; i++) printf("%d ", a[i]);
        putchar('\n');
        return 0;
    }

    Three-reversal কৌশল — O(n) time, O(1) extra space।

  5. Check if an array is sorted (non-decreasing).
    Array sorted কি না যাচাই করুন।
    ✨ Show Answer
    is_sorted.c
    #include <stdio.h>
    int is_sorted(const int *a, int n) {
        for (int i = 1; i < n; i++) if (a[i] < a[i-1]) return 0;
        return 1;
    }
    int main(void) {
        int a[] = {1, 3, 5, 7, 9};
        printf("%s\n", is_sorted(a, 5) ? "sorted" : "not sorted");
        return 0;
    }
  6. Merge two sorted arrays into one sorted array.
    দুটি sorted array মিশিয়ে একটি sorted array বানান।
    ✨ Show Answer
    merge.c
    #include <stdio.h>
    int main(void) {
        int a[] = {1, 4, 7, 10};
        int b[] = {2, 3, 8, 12, 15};
        int na = 4, nb = 5;
        int out[20], i = 0, j = 0, k = 0;
        while (i < na && j < nb) out[k++] = a[i] <= b[j] ? a[i++] : b[j++];
        while (i < na) out[k++] = a[i++];
        while (j < nb) out[k++] = b[j++];
        for (int m = 0; m < k; m++) printf("%d ", out[m]);
        putchar('\n');
        return 0;
    }
  7. Remove duplicates from a sorted array in place.
    Sorted array থেকে in-place duplicate remove করুন।
    ✨ Show Answer
    dedup.c
    #include <stdio.h>
    int main(void) {
        int a[] = {1, 1, 2, 3, 3, 4, 5, 5};
        int n = 8, w = 1;
        for (int i = 1; i < n; i++) if (a[i] != a[w - 1]) a[w++] = a[i];
        for (int i = 0; i < w; i++) printf("%d ", a[i]);
        putchar('\n');
        return 0;
    }
  8. Transpose a 3×3 matrix.
    ৩×৩ matrix-এর transpose বের করুন।
    ✨ Show Answer
    transpose.c
    #include <stdio.h>
    int main(void) {
        int m[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
        for (int i = 0; i < 3; i++)
            for (int j = i + 1; j < 3; j++) {
                int t = m[i][j]; m[i][j] = m[j][i]; m[j][i] = t;
            }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) printf("%3d ", m[i][j]);
            putchar('\n');
        }
        return 0;
    }
  9. Multiply two 2×2 matrices.
    দুটি ২×২ matrix গুণ করুন।
    ✨ Show Answer
    matmul.c
    #include <stdio.h>
    int main(void) {
        int A[2][2] = {{1,2},{3,4}};
        int B[2][2] = {{5,6},{7,8}};
        int C[2][2] = {{0}};
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < 2; j++)
                for (int k = 0; k < 2; k++) C[i][j] += A[i][k] * B[k][j];
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) printf("%4d ", C[i][j]);
            putchar('\n');
        }
        return 0;
    }
  10. Find the second largest element without sorting.
    Sort না করেই দ্বিতীয় বৃহত্তম element বের করুন।
    ✨ Show Answer
    second.c
    #include <stdio.h>
    #include <limits.h>
    int main(void) {
        int a[] = {42, 7, 99, 3, 99, 21};
        int n = 6, first = INT_MIN, second = INT_MIN;
        for (int i = 0; i < n; i++) {
            if (a[i] > first) { second = first; first = a[i]; }
            else if (a[i] > second && a[i] < first) second = a[i];
        }
        printf("first=%d, second=%d\n", first, second);
        return 0;
    }
  11. Linear search — find the index of a target or return −1.
    Linear search — target-এর index পেলে return করুন, না পেলে −1।
    ✨ Show Answer
    linear.c
    #include <stdio.h>
    int find(const int *a, int n, int key) {
        for (int i = 0; i < n; i++) if (a[i] == key) return i;
        return -1;
    }
    int main(void) {
        int a[] = {3, 5, 7, 9, 11};
        printf("index of 7 = %d\n", find(a, 5, 7));
        printf("index of 4 = %d\n", find(a, 5, 4));
        return 0;
    }
  12. Iterative binary search on a sorted array.
    Sorted array-তে iterative binary search।
    ✨ Show Answer
    binsearch.c
    #include <stdio.h>
    int bs(const int *a, int n, int key) {
        int lo = 0, hi = n - 1;
        while (lo <= hi) {
            int m = lo + (hi - lo) / 2;
            if (a[m] == key) return m;
            else if (a[m] < key) lo = m + 1;
            else hi = m - 1;
        }
        return -1;
    }
    int main(void) {
        int a[] = {1, 3, 7, 12, 19, 25, 42};
        printf("%d\n", bs(a, 7, 19));
        return 0;
    }
  13. Spiral-print a 3×3 matrix.
    ৩×৩ matrix-কে spiral order-এ প্রিন্ট করুন।
    ✨ Show Answer
    spiral.c
    #include <stdio.h>
    int main(void) {
        int m[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
        int top = 0, bot = 2, lef = 0, rig = 2;
        while (top <= bot && lef <= rig) {
            for (int i = lef; i <= rig; i++) printf("%d ", m[top][i]); top++;
            for (int i = top; i <= bot; i++) printf("%d ", m[i][rig]); rig--;
            if (top <= bot) { for (int i = rig; i >= lef; i--) printf("%d ", m[bot][i]); bot--; }
            if (lef <= rig) { for (int i = bot; i >= top; i--) printf("%d ", m[i][lef]); lef++; }
        }
        putchar('\n');
        return 0;
    }
  14. Find the majority element (appears > n/2 times) — Boyer–Moore.
    Majority element (> n/2 বার) — Boyer–Moore algorithm।
    ✨ Show Answer
    majority.c
    #include <stdio.h>
    int main(void) {
        int a[] = {2, 2, 1, 2, 3, 2, 2};
        int n = 7, cand = 0, cnt = 0;
        for (int i = 0; i < n; i++) {
            if (cnt == 0) cand = a[i];
            cnt += (a[i] == cand) ? 1 : -1;
        }
        printf("majority = %d\n", cand);
        return 0;
    }
  15. Given two arrays, print their intersection (distinct common elements).
    দুটি array-এর intersection প্রিন্ট করুন (ইউনিক মিল)।
    ✨ Show Answer
    intersect.c
    #include <stdio.h>
    int main(void) {
        int a[] = {1, 2, 3, 4, 5};
        int b[] = {3, 4, 5, 6, 7};
        int na = 5, nb = 5;
        for (int i = 0; i < na; i++)
            for (int j = 0; j < nb; j++)
                if (a[i] == b[j]) { printf("%d ", a[i]); break; }
        putchar('\n');
        return 0;
    }
  16. Explain why sizeof(arr) inside a function is different from in main.
    Function-এর ভেতর ও main-এ sizeof(arr) আলাদা কেন?
    ✨ Show Answer

    Array যখন function-এ পাস হয়, তখন এটি একটি pointer-এ decay করে। তাই function-এর ভেতর sizeof(arr) pointer-এর size (সাধারণত 8 byte), পুরো array-এর নয়। main-এ array-র সম্পূর্ণ type জানা, তাই সেখানে সঠিক মোট size পাওয়া যায়। এজন্যই function-এ array পাঠানোর সময় length আলাদাভাবে পাঠাতে হয়।

  17. Build a histogram — count how many times each value in 0..9 appears.
    Histogram বানান — 0..9-এর প্রতিটি মান array-তে কতবার আছে।
    ✨ Show Answer
    histogram.c
    #include <stdio.h>
    int main(void) {
        int data[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 0, 0};
        int n = sizeof(data) / sizeof(data[0]);
        int bins[10] = {0};
        for (int i = 0; i < n; i++) bins[data[i]]++;
        for (int i = 0; i < 10; i++) {
            printf("%d: ", i);
            for (int j = 0; j < bins[i]; j++) putchar('*');
            putchar('\n');
        }
        return 0;
    }
  18. Demonstrate a buffer overrun that -fsanitize=address can catch.
    একটি buffer overrun দেখান যা -fsanitize=address ধরতে পারে।
    ✨ Show Answer
    #include <stdio.h>
    int main(void) {
        int a[5];
        printf("%d\n", a[100]);   // reads out of bounds — UB
        return 0;
    }
    
    // Compile: gcc -fsanitize=address buggy.c
    // Run ./a.out — AddressSanitizer will print a detailed report.

    Online runner-এ AddressSanitizer সবসময় enabled থাকে না; নিজের মেশিনে চালিয়ে দেখুন।

Glossary (শব্দকোষ)

TermMeaningবাংলায়
ArrayA fixed-size, contiguous collection of same-type elements.একই type-এর element-এর পাশাপাশি সাজানো সংগ্রহ।
IndexThe integer position of an element (starts at 0).Element-এর integer অবস্থান (০ থেকে শুরু)।
ElementA single value stored at one index.একটি index-এ থাকা একক মান।
BoundsThe valid range of indices: 0 to n-1.বৈধ index-এর সীমা: 0 থেকে n-1।
SubscriptThe [i] syntax for accessing an element.Element access করার [i] notation।
Contiguous MemoryMemory laid out without gaps.ফাঁক ছাড়া পাশাপাশি মেমরি।
Multi-dimensional ArrayArray of arrays (e.g., 2D matrix).Array-এর array (যেমন 2D ম্যাট্রিক্স)।
Row-major Order2D arrays are stored row by row.2D array সারি ধরে ধরে সংরক্ষিত হয়।
Array DecayArray name automatically converts to a pointer to its first element.Array name স্বয়ংক্রিয়ভাবে pointer-এ পরিণত।
Out-of-bounds AccessReading/writing past the array — undefined behavior.সীমার বাইরে access — undefined behavior।
Initialization List{1, 2, 3} syntax for setting initial array values.{1, 2, 3} দিয়ে initial মান দেওয়ার গঠন।
Variable-Length Array (VLA)Array whose size is set at runtime (C99).Runtime-এ size নির্ধারিত array (C99)।

Summary — Module 13

Arrays are contiguous. Indexing starts at 0. C doesn't check bounds. When passed, arrays decay to pointers — you must pass the length separately. 2D arrays are row-major.

Next Module → Pointers I — C-র হৃদয়।