Arrays — Contiguous Memory
পাশাপাশি সাজানো মেমরির সম্ভাবনা ও বিপদ
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.
int a[5]; ঘোষণা করলে memory-তে পরপর ৫টি int-size জায়গা বরাদ্দ হয়।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
#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;
}
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 হয় না।
#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;
}
sizeof(a) আসলে pointer-এর size (সাধারণত 8 byte), array-এর না। তাই ফাংশনে array পাঠানোর সময় সবসময় length আলাদাভাবে পাঠাতে হবে।5. 2D & Multi-Dimensional Arrays
#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;
}
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
- 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; } - 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; } - 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; } - 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।
- 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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; } - 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 আলাদাভাবে পাঠাতে হয়। - 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; } - Demonstrate a buffer overrun that
-fsanitize=addresscan 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 (শব্দকোষ)
| Term | Meaning | বাংলায় |
|---|---|---|
| Array | A fixed-size, contiguous collection of same-type elements. | একই type-এর element-এর পাশাপাশি সাজানো সংগ্রহ। |
| Index | The integer position of an element (starts at 0). | Element-এর integer অবস্থান (০ থেকে শুরু)। |
| Element | A single value stored at one index. | একটি index-এ থাকা একক মান। |
| Bounds | The valid range of indices: 0 to n-1. | বৈধ index-এর সীমা: 0 থেকে n-1। |
| Subscript | The [i] syntax for accessing an element. | Element access করার [i] notation। |
| Contiguous Memory | Memory laid out without gaps. | ফাঁক ছাড়া পাশাপাশি মেমরি। |
| Multi-dimensional Array | Array of arrays (e.g., 2D matrix). | Array-এর array (যেমন 2D ম্যাট্রিক্স)। |
| Row-major Order | 2D arrays are stored row by row. | 2D array সারি ধরে ধরে সংরক্ষিত হয়। |
| Array Decay | Array name automatically converts to a pointer to its first element. | Array name স্বয়ংক্রিয়ভাবে pointer-এ পরিণত। |
| Out-of-bounds Access | Reading/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.