C అర్రేలు (1D Arrays & 2D Matrices) & మెమరీ మోడల్

⚡ Modern C (C99 / C11 / C17 Standards) 🟢 Chapter 13 of 20 📂 Phase 04: అర్రేస్, స్ట్రింగ్స్ & పాయింటర్లు 📅 2026 Academic Edition
📌 Covered in this chapter: అపార్ట్‌మెంట్ & రైలు బోగీల ఎనాలజీ · కంటిగ్యువస్ మెమరీ · 0-ఇండెక్సింగ్ ఆఫ్‌సెట్ సీక్రెట్ · బౌండరీ చెకింగ్ లోపం & బఫర్ ఓవర్‌ఫ్లో · sizeof ట్రిక్ · Array Decay into Pointer · 2D మ్యాట్రిక్స్ రిప్రజెంటేషన్ · Row-Major Order గణిత సూత్రం · మ్యాట్రిక్స్ మల్టిప్లికేషన్ · స్టూడెంట్ గ్రేడింగ్ ప్రాజెక్ట్ · ఇంటరాక్టివ్ క్విజ్

ఒక పెద్ద ఇంజనీరింగ్ కాలేజీలో 100 మంది విద్యార్థుల మార్కులను కంప్యూటర్‌లో భద్రపరచాలనుకుందాం. అర్రేలు లేకపోతే మీరు ఏం చేయాలి? int mark1, mark2, mark3, ... mark100; అని వంద వేర్వేరు వేరియబుల్స్ రాయాలి! ఆ వంద వేరియబుల్స్ సగటు (Average) లేదా గరిష్ట మార్కులు కనుక్కోవాలంటే వంద లైన్ల + మరియు if కండిషన్లు రాయాల్సి వస్తుంది. ఇది ప్రోగ్రామర్ పాలిట నరకం కదా?

ఇప్పుడు ఒక అపార్ట్‌మెంట్ భవనాన్ని (Apartment Complex) లేదా రైలులోని పక్కపక్కనే ఉన్న బోగీలను (Train Compartments) ఊహించుకోండి. రైలులోని బోగీలు ఒకదాని వెనుక ఒకటి వరుసగా కనెక్ట్ అయి ఉంటాయి. ప్రతి బోగీకి ఒక వరుస సంఖ్య (0, 1, 2, 3...) ఉంటుంది. మీరు 4వ బోగీకి వెళ్లాలంటే మొదటి నుండి నడుచుకుంటూ వెళ్లనవసరం లేదు; రైలు పొడవు ఆధారంగా నేరుగా ఆ బోగీ వద్దకే దూకవచ్చు ($O(1)$ Random Access)!

కంప్యూటర్ సైన్స్‌లో ఈ వరుస మెమరీ గదుల నిర్మాణాన్ని అర్రే (Array — Contiguous Memory Allocation) అంటారు. ఈ పదమూడవ అధ్యాయంతో మనం Phase 04 (అర్రేస్, స్ట్రింగ్స్ & పాయింటర్లు) లోకి గ్రాండ్‌గా అడుగుపెడుతున్నాం. ఇందులో 1D అర్రేలు, 2D మ్యాట్రిసెస్, Row-Major Order మెమరీ గణిత సూత్రాలు, బఫర్ ఓవర్‌ఫ్లో ప్రమాదాలు, మరియు పూర్తి స్థాయి మ్యాట్రిక్స్ మల్టిప్లికేషన్ & స్టూడెంట్ గ్రేడింగ్ ఇంజిన్‌ను నిర్మిద్దాం!

1ఈ Chapter లో మీరు నేర్చుకునే సమగ్ర అంశాలు (Roadmap)

డేటా స్ట్రక్చర్స్ మరియు అల్గారిథమ్స్‌లో అర్రే అనేది అత్యంత ప్రాథమికమైన మరియు వేగవంతమైన బిల్డింగ్ బ్లాక్. ఈ అధ్యాయంలో కవర్ చేయబడే ప్రధానాంశాలు:

  • అర్రే ప్రాథమిక ఆవశ్యకత: హోమోజీనియస్ ఎలిమెంట్స్ (Homogeneous Data Types) మరియు వేల వేరియబుల్స్‌ను ఒకే పేరుతో పిలవడం.
  • కంటిగ్యువస్ మెమరీ కేటాయింపు (Contiguous Allocation): RAM లో ఎలిమెంట్స్ మధ్య ఖాళీ లేకుండా పక్కపక్కనే భద్రపరచడం.
  • 0-బేస్డ్ ఇండెక్సింగ్ రహస్యం: C లో ఇండెక్స్ 1 నుండి కాకుండా 0 నుండే ఎందుకు మొదలవుతుంది? (ఆఫ్‌సెట్ కాలిక్యులేషన్).
  • 1D అర్రే డిక్లరేషన్ & ఇనిషియలైజేషన్: కంప్లీట్, పార్షియల్, మరియు డైనమిక్ సైజ్ ఇనిషియలైజర్స్.
  • బౌండ్స్ చెకింగ్ లోపం (No Bounds Checking in C): C కంపైలర్ ఇండెక్స్ లిమిట్లను ఎందుకు తనిఖీ చేయదు? సెగ్‌ఫాల్ట్ ప్రమాదాలు.
  • అర్రే సైజు ఆటో-కాలిక్యులేషన్: sizeof(arr) / sizeof(arr[0]) గోల్డెన్ ఇడియమ్.
  • ఫంక్షన్లకు అర్రేలను పాస్ చేయడం: Array Decay అంటే ఏమిటి? సైజును ప్రత్యేక పారామీటర్‌గా ఎందుకు పాస్ చేయాలి?
  • 2D అర్రేలు (Two-Dimensional Matrices): టేబుల్ ఫార్మాట్, రోస్ మరియు కాలమ్స్ విజువలైజేషన్.
  • Row-Major Order మెమరీ ఫార్ములా: హార్డ్‌వేర్ RAM లో 2D మ్యాట్రిక్స్ 1D గా ఎలా రూపాంతరం చెందుతుంది? అడ్రస్ గణన సమీకరణం.
  • మ్యాట్రిక్స్ ఆపరేషన్లు: మ్యాట్రిక్స్ కూడిక (Addition) మరియు $O(N^3)$ మ్యాట్రిక్స్ గుణకారం (Multiplication).
  • సమగ్ర రియల్ వరల్డ్ ప్రాజెక్ట్: మల్టీ-సబ్జెక్ట్ స్టూడెంట్ గ్రేడింగ్ & క్లాస్ టాపర్ అనలిటిక్స్ సిస్టమ్.
  • బిగినర్స్ చేసే టాప్ 5 అర్రే తప్పులు: ఆఫ్-బై-వన్, డైరెక్ట్ అసైన్‌మెంట్ (arr1 = arr2) మిథ్య, నెగెటివ్ ఇండెక్సింగ్.
  • స్వీయ మూల్యాంకన క్విజ్: 5 లోతైన ప్రాక్టికల్ ప్రశ్నలు & గేట్ ఎగ్జామ్ బిట్స్.
2అర్రే ప్రాథమిక భావన — కంటిగ్యువస్ మెమరీ & O(1) రాండమ్ యాక్సెస్

కంప్యూటర్ ప్రోగ్రామింగ్‌లో అర్రే (Array) అనగా: ఒకే డేటా టైప్‌కు చెందిన బహుళ అంశాలను RAM లో ఒకదాని పక్కన ఒకటి వరుసగా (Contiguous Memory Locations) నిల్వ చేసే స్థిర పరిమాణ డేటా నిర్మాణం.

కంటిగ్యువస్ మెమరీ యొక్క సూపర్ పవర్: O(1) Random Access

ఎలిమెంట్స్ అన్నీ పక్కపక్కనే ఉండటం వలన, కంప్యూటర్ CPU మొదటి ఎలిమెంట్ ఉన్న మెమరీ అడ్రస్ (Base Address) ఆధారంగా — 100వ ఎలిమెంట్ లేదా 10,000వ ఎలిమెంట్ ఏ అడ్రస్‌లో ఉందో ఒక్క సాధారణ గుణకారం ద్వారా మైక్రోసెకన్లలో లెక్కించగలదు! మధ్యలోని ఎలిమెంట్లను వెతకాల్సిన అవసరం లేకుండా నేరుగా ఏ ఎలిమెంట్‌నైనా ఒకే వేగంతో యాక్సెస్ చేయగలదు. దీనినే $O(1)$ Constant Time Access అంటారు.

31D అర్రే డిక్లరేషన్, 0-ఇండెక్సింగ్ సీక్రెట్ & అడ్రస్ గణన

C లో 1D అర్రేను డిక్లేర్ చేసే ప్రామాణిక సింటాక్స్ ఇది:

డేటా_టైప్ అర్రే_పేరు [ పరిమాణం ];
ఉదాహరణ: int marks[5] = {85, 92, 78, 64, 99};

C లో ఇండెక్స్ 0 నుండి ఎందుకు ప్రారంభమవుతుంది? (The Offset Formula):

చాలా మంది కొత్త ప్రోగ్రామర్లకు ఆశ్చర్యం కలుగుతుంది: మొదటి ఎలిమెంట్‌ను marks[1] అనకుండా marks[0] అని ఎందుకు పిలవాలి? ఎందుకంటే C లో ఇండెక్స్ అనేది ఒక సంఖ్య కాదు; అది బేస్ అడ్రస్ నుండి ఉండే దూరం (Memory Offset)!

$$ ext{Address of } A[i] = ext{Base Address} + (i imes ext{sizeof(DataType)})$$

మొదటి ఎలిమెంట్ బేస్ అడ్రస్ వద్దే ఉంటుంది కాబట్టి, దాని దూరం (Offset) సరిగ్గా 0! అందుకే $i = 0$:

Base Address = 1000, int size = 4 bytes:
marks[0] అడ్రస్ = 1000 + (0 * 4) = 1000 (0 దూరంలో మొదటి ఎలిమెంట్)
marks[1] అడ్రస్ = 1000 + (1 * 4) = 1004 (4 బైట్ల దూరంలో 2వ ఎలిమెంట్)
marks[2] అడ్రస్ = 1000 + (2 * 4) = 1008 (8 బైట్ల దూరంలో 3వ ఎలిమెంట్)
C — Array Traversal & Contiguous Memory Addresses
#include <stdio.h>

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

    printf("=== అర్రే ఎలిమెంట్స్ & వాటి మెమరీ చిరునామాలు (Contiguous Proof) ===\n");
    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %2d  |  మెమరీ అడ్రస్ = %p\n", i, arr[i], (void*)&arr[i]);
    }

    return 0;
}

పైన కోడ్ రన్ చేస్తే ప్రతి అడ్రస్‌కు తర్వాతి అడ్రస్‌కు మధ్య ఖచ్చితంగా 4 బైట్ల వ్యత్యాసం ఉండటాన్ని మీరు స్పష్టంగా చూడవచ్చు!

4బౌండ్స్ చెకింగ్ లోపం & బఫర్ ఓవర్‌ఫ్లో ప్రమాదాలు

జావా లేదా పైథాన్ వంటి ఇతర ఆధునిక భాషలలో మీరు 5 సైజు ఉన్న అర్రేలో 10వ ఇండెక్స్‌ను యాక్సెస్ చేయబోతే, రన్‌టైమ్ వెంటనే IndexOutOfBoundsException అని అరిచి ఆపేస్తుంది. కానీ C లాంగ్వేజ్‌లో:

⚠️ C లో బౌండరీ తనిఖీ బొత్తిగా ఉండదు (No Bounds Checking)!
C అనేది గరిష్ట వేగం కోసం రూపొందించబడిన భాష. ప్రతి లూప్‌లోనూ CPU ఇండెక్స్ పరిమితిని తనిఖీ చేస్తే వేగం తగ్గుతుందని డెన్నిస్ రిచీ బౌండ్స్ చెకింగ్‌ను పూర్తిగా తీసేశారు. మీరు int a[5]; అని రాసి a[10] = 999; అని రాస్తే — కంపైలర్ మిమ్మల్ని ఆపదు! అది అర్రే దాటి ప్రక్కనే ఉన్న వేరే వేరియబుల్ మెమరీలోకి దూసుకుపోయి అక్కడి విలువను చెరిపేస్తుంది. దీనినే బఫర్ ఓవర్‌ఫ్లో (Buffer Overflow) అంటారు! ఇది సాఫ్ట్‌వేర్ క్రాష్‌లకు మరియు హ్యాకర్లు కంప్యూటర్‌ను హ్యాక్ చేయడానికి కారణమవుతుంది!
5అర్రే సైజు ఆటో-కాలిక్యులేషన్ — sizeof గోల్డెన్ ట్రిక్

ఒక అర్రేలో ఎన్ని ఎలిమెంట్స్ ఉన్నాయో హార్డ్-కోడ్ చేయకుండా, ప్రోగ్రామ్ స్వయంచాలకంగా లెక్కించడానికి C లో అత్యంత ప్రసిద్ధ ఇంజనీరింగ్ సూత్రం:

$$ ext{Element Count} = rac{ ext{sizeof(entire array)}}{ ext{sizeof(single element)}} = rac{ ext{sizeof(arr)}}{ ext{sizeof(arr[0])}}$$
C — Dynamic Array Length using sizeof
#include <stdio.h>

int main() {
    double prices[] = {19.99, 45.50, 120.00, 8.75, 99.90, 250.00};

    // మొత్తం అర్రే సైజు: 6 elements * 8 bytes = 48 bytes
    // ఒక్క ఎలిమెంట్ సైజు: 8 bytes
    // పొడవు = 48 / 8 = 6 elements!
    int count = sizeof(prices) / sizeof(prices[0]);

    printf("మొత్తం ప్రొడక్టుల సంఖ్య: %d\n", count);
    for (int i = 0; i < count; i++) {
        printf("ప్రొడక్ట్ #%d: రూ. %.2f\n", i + 1, prices[i]);
    }

    return 0;
}
6ఫంక్షన్లకు అర్రేలను పాస్ చేయడం — Array Decay into Pointer

ఒక అర్రేను ఫంక్షన్‌కు పారామీటర్‌గా పంపినప్పుడు C లో ఒక వింతైన మార్పు జరుగుతుంది: మొత్తం అర్రే ఎప్పటికీ కాపీ కాదు! కేవలం మొదటి ఎలిమెంట్ యొక్క పాయింటర్ (Pointer to first element) మాత్రమే వెళ్తుంది. దీనినే Array Decay అంటారు.

💡 గోల్డెన్ రూల్: ఫంక్షన్ లోపల sizeof(arr) లెక్కిస్తే అర్రే సైజు రాదు, కేవలం పాయింటర్ సైజు (8 బైట్లు) మాత్రమే వస్తుంది! అందుకే ఫంక్షన్‌కు అర్రేతో పాటు దాని సైజును కూడా ఎల్లప్పుడూ రెండవ పారామీటర్‌గా పంపాలి!
C — Passing Array to Function with Size
#include <stdio.h>

// int arr[] అనేది సాంకేతికంగా int *arr తో సమానం!
double calculateAverage(const int arr[], int size) {
    long sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return (double)sum / size;
}

int main() {
    int scores[] = {88, 92, 79, 95, 84};
    int len = sizeof(scores) / sizeof(scores[0]);

    double avg = calculateAverage(scores, len); // అర్రే పేరు మాత్రమే పాస్ చేస్తాం
    printf("తరగతి సగటు మార్కులు: %.2f\n", avg);
    return 0;
}
72D అర్రేలు (Two-Dimensional Matrices) & గ్రిడ్ రిప్రజెంటేషన్

గణితంలో మ్యాట్రిక్స్ (Matrix), ఎక్సెల్ స్ప్రెడ్‌షీట్ (Spreadsheet), లేదా చదరంగం బోర్డు (Chessboard) లాంటి 2D గ్రిడ్‌లను కంప్యూటర్‌లో నిల్వ చేయడానికి 2D అర్రేలు ఉపయోగపడతాయి. ఇందులో అడ్డు వరుసలు (Rows) మరియు నిలువు వరుసలు (Columns) ఉంటాయి:

డేటా_టైప్ మ్యాట్రిక్స్_పేరు [ రోస్ ] [ కాలమ్స్ ];
int matrix[3][3] = {
    {1, 2, 3}, // Row 0
    {4, 5, 6}, // Row 1
    {7, 8, 9} // Row 2
};
C — 2D Matrix Declaration & Formatted Grid Display
#include <stdio.h>

int main() {
    int grid[2][4] = {
        {10, 20, 30, 40},
        {50, 60, 70, 80}
    };

    printf("=== 2x4 మ్యాట్రిక్స్ గ్రిడ్ ప్రింటింగ్ ===\n");
    for (int r = 0; r < 2; r++) { // Rows లూప్
        for (int c = 0; c < 4; c++) { // Cols లూప్
            printf("%4d ", grid[r][c]);
        }
        printf("\n");
    }

    return 0;
}
8Row-Major Order మెమరీ ఫార్ములా (హార్డ్‌వేర్ ఆర్కిటెక్చర్)

కంప్యూటర్ సైన్స్‌లో అత్యంత ముఖ్యమైన వాస్తవం: భౌతికంగా కంప్యూటర్ RAM లో 2D అర్రేలు అంటూ ఏమీ ఉండవు! RAM అనేది కేవలం ఒక సరళరేఖ లాంటి 1D వరుస మెమరీ మాత్రమే!

మరి కంపైలర్ 2D మ్యాట్రిక్స్‌ను RAM లో ఎలా నిల్వ చేస్తుంది? C లాంగ్వేజ్ Row-Major Order అనే పద్ధతిని పాటిస్తుంది. అంటే మొదటి అడ్డు వరుస (Row 0) ను ముందుగా భద్రపరిచి, దాని వెంటే రెండవ అడ్డు వరుస (Row 1), ఆ వెంటే మూడవ వరుసను వరుసగా అమర్చుతుంది:

Row-Major Order 2D అడ్రస్ ఫార్ములా:

$M imes N$ సైజు ఉన్న మ్యాట్రిక్స్‌లో (ఇక్కడ $N$ అనేది కాలమ్స్ సంఖ్య), $M[i][j]$ ఉన్న భౌతిక మెమరీ అడ్రస్ సమీకరణం:

$$ ext{Address}(M[i][j]) = ext{Base Address} + Big( (i imes ext{Total Columns}) + j Big) imes ext{sizeof(DataType)}$$

ఈ ఫార్ములా కారణంగానే, ఫంక్షన్‌కు 2D అర్రేను పారామీటర్‌గా పాస్ చేసేటప్పుడు కాలమ్స్ సంఖ్యను కచ్చితంగా పేర్కొనాలి (ఉదా: void process(int arr[][4])). కాలమ్స్ సంఖ్య తెలియకపోతే కంపైలర్ ఒక వరుసను దాటడానికి ఎన్ని బైట్లు దూకాలో లెక్కించలేదు!

9సమగ్ర తులనాత్మక పట్టిక (1D Arrays vs 2D Matrices)

1D మరియు 2D అర్రేల మధ్య గల సమగ్ర సాంకేతిక పోలికలు:

అంశం / ఫీచర్ 1D అర్రే (One-Dimensional) 2D అర్రే (Two-Dimensional Matrix)
మానసిక విజువలైజేషన్ ఒక సరళ రేఖ లేదా రైలు బోగీల క్రమం. టేబుల్, గ్రిడ్, అడ్డు & నిలువు వరుసల చట్రం.
ఇండెక్సింగ్ అవసరం ఒకే ఇండెక్స్: arr[i] రెండు ఇండెక్స్‌లు: arr[row][col]
ట్రావర్సల్ లూప్స్ సింగిల్ లూప్ సరిపోతుంది ($O(N)$). నెస్టెడ్ లూప్స్ తప్పనిసరి ($O(N imes M)$).
మెమరీ అమరిక కంటిగ్యువస్ 1D బ్లాక్. RAM లో Row-Major Order ప్రకారం వరుసగా 1D లోనే నిల్వ అవుతుంది.
ఫంక్షన్ పారామీటర్ రూల్ void f(int arr[]) బ్రాకెట్ ఖాళీగా ఉంచవచ్చు. void f(int arr[][COLS]) కాలమ్స్ సైజు తప్పనిసరిగా ఇవ్వాలి!
ఉత్తమ ఉదాహరణ విద్యార్థుల మార్కుల జాబితా, ఉష్ణోగ్రతల నమోదు. చదరంగం బోర్డు, ఇమేజ్ పిక్సెల్స్ గ్రిడ్, గ్రాఫ్ ఎడ్జెసెంట్ మ్యాట్రిక్స్.
10మ్యాట్రిక్స్ కూడిక & గుణకారం (Matrix Math)

రెండు మ్యాట్రిక్స్‌లను గుణించాలంటే ఒక కఠినమైన గణిత నిబంధన ఉంది: మొదటి మ్యాట్రిక్స్ యొక్క కాలమ్స్ సంఖ్య రెండవ మ్యాట్రిక్స్ యొక్క రోస్ సంఖ్యకు సమానంగా ఉండాలి! దీనిని సాధించడానికి 3 స్థాయిల నెస్టెడ్ లూప్స్ ($O(N^3)$) వాడతాం:

C — 2x2 Matrix Multiplication Engine
#include <stdio.h>

int main() {
    int A[2][2] = { {1, 2}, {3, 4} };
    int B[2][2] = { {5, 6}, {7, 8} };
    int C[2][2] = { {0, 0}, {0, 0} };

    // మ్యాట్రిక్స్ గుణకారం (Matrix Multiplication O(N^3))
    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];
            }
        }
    }

    printf("=== మ్యాట్రిక్స్ గుణకార ఫలితం (A x B) ===\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%4d ", C[i][j]);
        }
        printf("\n");
    }

    return 0;
}
11సమగ్ర రియల్ వరల్డ్ ప్రాజెక్ట్ — స్టూడెంట్ గ్రేడింగ్ & టాపర్ అనలిటిక్స్

ఇప్పటివరకు నేర్చుకున్న 1D మరియు 2D అర్రేలను ఉపయోగించి ఒక సమగ్ర విద్యార్థుల మార్కుల విశ్లేషణ ఇంజిన్ (Academic Analytics Engine) నిర్మిద్దాం. ఇందులో 3 మంది విద్యార్థులు, 4 సబ్జెక్టుల మార్కులను ప్రాసెస్ చేసి, ప్రతి విద్యార్థి మొత్తం మార్కులు, సగటు మరియు క్లాస్ టాపర్‌ను కనుగొంటాం:

C — Academic Performance & Class Topper Analytics
#include <stdio.h>

#define STUDENTS 3
#define SUBJECTS 4

int main() {
    // విద్యార్థుల పేర్లు
    const char* names[STUDENTS] = {"అఖిల్ వర్మ", "భావన రెడ్డి", "చైతన్య కృష్ణ"};

    // 2D అర్రే: 3 విద్యార్థులు x 4 సబ్జెక్టుల మార్కులు (Maths, Physics, Chem, CS)
    int marks[STUDENTS][SUBJECTS] = {
        {92, 85, 88, 95}, // అఖిల్
        {96, 94, 91, 98}, // భావన
        {78, 82, 80, 85}  // చైతన్య
    };

    printf("==============================================================\n");
    printf("     మనా అకడమిక్ గ్రేడింగ్ రిపోర్ట్ (Academic Analytics 2026)\n");
    printf("==============================================================\n");
    printf("%-16s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s\n",
           "విద్యార్థి పేరు", "M1", "M2", "M3", "M4", "మొత్తం", "సగటు%%");
    printf("--------------------------------------------------------------\n");

    int highestTotal = -1;
    int topperIndex = -1;

    for (int i = 0; i < STUDENTS; i++) {
        int studentTotal = 0;
        printf("%-16s | ", names[i]);

        for (int j = 0; j < SUBJECTS; j++) {
            printf("%-6d | ", marks[i][j]);
            studentTotal += marks[i][j];
        }

        double percentage = (double)studentTotal / SUBJECTS;
        printf("%-6d | %-6.2f%%\n", studentTotal, percentage);

        // క్లాస్ టాపర్ ను కనుగొనడం
        if (studentTotal > highestTotal) {
            highestTotal = studentTotal;
            topperIndex = i;
        }
    }

    printf("==============================================================\n");
    printf("🏆 క్లాస్ టాపర్: %s (మొత్తం స్కోర్: %d / %d)\n",
           names[topperIndex], highestTotal, SUBJECTS * 100);
    printf("==============================================================\n");

    return 0;
}
12సాధారణంగా బిగినర్స్ చేసే టాప్ 5 అర్రే తప్పులు
1. ఆఫ్-బై-వన్ ఇండెక్సింగ్ బగ్ (Off-by-One):
10 సైజు ఉన్న అర్రేకు for (int i = 0; i <= 10; i++) అని రాయడం వలన arr[10] మెమరీ క్రాష్‌కు దారితీస్తుంది. ఎల్లప్పుడూ i < 10 వాడాలి.
2. ఒక అర్రేను మరొక అర్రేకు డైరెక్ట్‌గా కాపీ చేయాలనుకోవడం (arr1 = arr2):
C లో a = b అని అర్రేలను కాపీ చేయలేము! అర్రే పేరు స్థిరమైన పాయింటర్ (Constant Pointer). ఎలిమెంట్ బై ఎలిమెంట్ లూప్ ద్వారా మాత్రమే కాపీ చేయాలి.
3. సైజు లేదా ఇనిషియలైజర్ లేకుండా అర్రే డిక్లేర్ చేయడం:
int a[]; అని రాస్తే కంపైలర్ ఎంత మెమరీ కేటాయించాలో తెలియక ఎర్రర్ ఇస్తుంది. కచ్చితంగా సైజు లేదా బ్రాకెట్ విలువలు ఇవ్వాలి.
4. ఫంక్షన్ లోపల sizeof(arr) లెక్కించడం:
ఫంక్షన్ లోపల అర్రే పాయింటర్‌గా డీకే అవుతుంది కాబట్టి sizeof కేవలం 8 బైట్లను ఇస్తుంది. సైజును మెయిన్ నుండి పంపాలి.
5. 2D అర్రే ఫంక్షన్ హెడర్‌లో కాలమ్స్ పరిమాణం వదిలేయడం:
void f(int a[][]) రాయకూడదు! కనీసం కాలమ్స్ సంఖ్య void f(int a[][4]) తప్పనిసరి.
13స్వీయ మూల్యాంకన క్విజ్ & మీరే స్వయంగా Try చేయండి!

ఈ పాఠంలోని లోతైన అంశాలను క్రింది 5 ప్రాక్టికల్ ప్రశ్నల ద్వారా పరీక్షించుకోండి:

❓ ప్రశ్న 1: C లో అర్రే ఎలిమెంట్స్ ఏ మెమరీ అమరిక ప్రకారం నిల్వ చేయబడతాయి?
సమాధానం: కంటిగ్యువస్ మెమరీ (Contiguous Memory Allocation) పద్ధతిలో, ఎటువంటి ఖాళీ లేకుండా పక్కపక్కనే ఉన్న మెమరీ గదులలో నిల్వ చేయబడతాయి.
❓ ప్రశ్న 2: అర్రే పేరును స్వతంత్రంగా వాడితే అది దేనిని సూచిస్తుంది?
సమాధానం: అర్రే పేరు ఆ అర్రేలోని మొదటి ఎలిమెంట్ యొక్క బేస్ మెమరీ అడ్రస్ (&arr[0]) ను సూచిస్తుంది (Constant Pointer).
❓ ప్రశ్న 3: C లో 2D అర్రేలను RAM లో నిల్వ చేయడానికి ఏ క్రమం ఉపయోగపడుతుంది?
సమాధానం: Row-Major Order. మొదటి అడ్డు వరుస ఎలిమెంట్స్ పూర్తయిన తర్వాతే రెండవ అడ్డు వరుస ఎలిమెంట్స్ లీనియర్‌గా నిల్వ చేయబడతాయి.
❓ ప్రశ్న 4: C కంపైలర్ అర్రే బౌండరీలను ఎందుకు తనిఖీ చేయదు (No Bounds Checking)?
సమాధానం: గరిష్ట ఎగ్జిక్యూషన్ వేగం మరియు సిస్టమ్స్ ప్రోగ్రామింగ్ సమర్థత కోసం. అయితే బౌండరీ దాటితే బఫర్ ఓవర్‌ఫ్లో మరియు సెగ్మెంటేషన్ ఫాల్ట్ ముప్పు ఉంటుంది.
❓ ప్రశ్న 5: 'sizeof(arr) / sizeof(arr[0])' ఫార్ములా దేనిని లెక్కిస్తుంది?
సమాధానం: మొత్తం అర్రేలో ఉన్న మొత్తం ఎలిమెంట్స్ సంఖ్యను (Length of Array) రన్‌టైమ్‌లో లెక్కిస్తుంది.
🚀 స్టూడెంట్ అనలిటిక్స్ & మ్యాట్రిక్స్ మల్టిప్లికేషన్‌ను మన ఆన్‌లైన్ C కంపైలర్‌లో రన్ చేయండి!

పైన వివరించిన స్టూడెంట్ గ్రేడింగ్ ఇంజిన్ మరియు మ్యాట్రిక్స్ మల్టిప్లికేషన్ కోడ్‌లను మన ఆన్‌లైన్ C కంపైలర్‌లో ఓపెన్ చేసి స్వయంగా రన్ చేయండి. విద్యార్థుల సంఖ్యను లేదా మ్యాట్రిక్స్ కొలతలను మార్చి ఫలితాలను పరీక్షించండి!

👉 Our Compiler లో C Compiler try చేయండి

📌 అధ్యాయ సారాంశం (Quick Summary):

  • అర్రేలు: ఒకే డేటా టైప్ కలిగిన అంశాలను పక్కపక్కనే నిల్వ చేసే కంటిగ్యువస్ మెమరీ బ్లాక్స్.
  • O(1) రాండమ్ యాక్సెస్: డైరెక్ట్ ఇండెక్స్ గుణకారం ద్వారా ఏ ఎలిమెంట్‌నైనా క్షణాల్లో పొందవచ్చు.
  • 0-ఇండెక్సింగ్: ఇండెక్స్ అనేది బేస్ అడ్రస్ నుండి ఉండే ఆఫ్‌సెట్ దూరం.
  • 2D మ్యాట్రిక్స్: Row-Major Order ద్వారా 1D RAM లో లీనియర్‌గా మ్యాప్ అవుతుంది.
  • బౌండ్స్ సేఫ్టీ: బఫర్ ఓవర్‌ఫ్లో నివారించడానికి లూప్స్ లో < SIZE మాత్రమే వాడాలి.
తర్వాతి అధ్యాయంలో (Chapter 14): కంప్యూటర్‌తో అక్షరాలు మరియు టెక్స్ట్‌తో మాట్లాడే క్యారెక్టర్ అర్రేలు (Character Arrays), నల్ టెర్మినేటర్ (\0) సీక్రెట్, మరియు <string.h> లైబ్రరీ ఫంక్షన్స్ గురించి లోతుగా నేర్చుకుందాం!
← Prev: 12. రికార్షన్ & కాల్ స్టాక్ Next: 14. స్ట్రింగ్స్ & <string.h> →
OC
Written by Our Compiler Technical Editorial Team
Reviewed for accuracy & tested on GCC 13+ / Clang 17 runtime · 2026 Academic Edition