వేరియబుల్ స్కోప్, లైఫ్‌టైమ్ & స్టోరేజ్ క్లాసెస్

⚡ Modern C (C99 / C11 / C17 Standards) 🟢 Chapter 11 of 20 📂 Phase 03: ఫంక్షన్స్, స్కోప్ & రికర్షన్ 📅 2026 Academic Edition
📌 Covered in this chapter: వేరియబుల్ స్కోప్ & విజిబిలిటీ · లైఫ్‌టైమ్ · వేరియబుల్ షాడోయింగ్ · auto డీఫాల్ట్ మెకానిక్స్ · register CPU స్పీడ్ & & పరిమితి · static లోకల్ పవర్ & Data Segment · static గ్లోబల్ ప్రైవసీ · extern మల్టీ-ఫైల్ లింకేజ్ · 4 స్టోరేజ్ క్లాసెస్ పట్టిక · యూనిక్ ట్రాన్సాక్షన్ ఐడీ ఇంజిన్ · ఇంటరాక్టివ్ క్విజ్

ఒక మనిషి యొక్క గుర్తింపు మరియు అధికారాన్ని ఊహించుకోండి. మీ ఇంట్లోని బెడ్‌రూమ్‌లో మీ వ్యక్తిగత డైరీ లేదా వస్తువులు ఉంటాయి. వాటిని కేవలం ఆ గది లోపల మాత్రమే మీరు చూసుకోగలరు; బయటి వీధిలోకి వెళ్తే ఎవరికీ కనిపించవు. ఇది లోకల్ స్కోప్ (Local Scope). అదే మీ గ్రామ పంచాయతీ లేదా కాలేజీ నోటీస్ బోర్డుపై ఉన్న సమాచారాన్ని ఆ ఊరిలోని ప్రతి పౌరుడూ చూడగలడు, దానిని ఎవరైనా మార్చవచ్చు. ఇది గ్లోబల్ స్కోప్ (Global Scope).

మరి ఒక పెద్ద గ్రంథాలయంలోని (Library) విజిటర్స్ లాగ్ బుక్ (Visitor Counter) ఎలాంటిది? ప్రతిరోజూ వందలాది మంది పాఠకులు వచ్చి పుస్తకాలు చదివి ఇంటికి వెళ్లిపోతారు (ఫంక్షన్ కాల్స్ ముగిసినట్లు). పాఠకులు వచ్చి వెళ్లినా, ఆ లాగ్ బుక్‌లోని మొత్తం కౌంటర్ అలాగే స్థిరంగా పెరుగుతూ నిల్వ ఉంటుంది తప్ప పాఠకుడు వెళ్లగానే సున్నా అవ్వదు! ఇది C లోని static వేరియబుల్ సూపర్ పవర్!

కంప్యూటర్ ప్రోగ్రామింగ్‌లో ఒక వేరియబుల్ RAM లో ఎక్కడ దాగి ఉంటుంది? దాని ప్రారంభ విలువ ఏమిటి? అది ఎంతసేపు బ్రతుకుతుంది? ప్రోగ్రామ్‌లోని ఏయే భాగాలు దానిని తాకగలవు? అనే నాలుగు పరమ రహస్యాలను నిర్ణయించేవే స్టోరేజ్ క్లాసెస్ (Storage Classes: auto, static, extern, register). ఈ పదకొండవ అధ్యాయంలో, మెమరీ సెగ్మెంట్స్, మల్టీ-ఫైల్ ప్రాజెక్ట్ లింకేజ్ మరియు సురక్షితమైన యూనిక్ బ్యాంకింగ్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్ ప్రాజెక్ట్‌ను లోతుగా నేర్చుకుందాం!

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

సిస్టమ్స్ లెవల్ C ప్రోగ్రామింగ్‌లో వేరియబుల్ మెమరీ లైఫ్‌సైకిల్‌ను అర్థం చేసుకోవడం చాలా ముఖ్యం. ఈ పాఠంలో కవర్ చేయబడే ప్రధాన అంశాలు:

  • వేరియబుల్ యొక్క 4 మూలస్తంభాలు: Storage Location, Default Initial Value, Scope (Visibility), మరియు Lifetime (Longevity).
  • స్కోప్ రకాలు (Scope Hierarchy): బ్లాక్ స్కోప్ { }, ఫంక్షన్ స్కోప్, మరియు ఫైల్/గ్లోబల్ స్కోప్.
  • వేరియబుల్ షాడోయింగ్ (Variable Shadowing): లోకల్ వేరియబుల్ గ్లోబల్ వేరియబుల్‌ను ఎలా దాచిపెడుతుంది?
  • auto స్టోరేజ్ క్లాస్: స్టాక్ మెమరీపై ఆటోమేటిక్ కేటాయింపు & గార్బేజ్ వాల్యూస్ (Garbage Values) ట్రాప్.
  • register స్టోరేజ్ క్లాస్: RAM కాకుండా నేరుగా CPU రిజిస్టర్లలో స్టోర్ చేయడం, మెరుపు వేగం & & (అడ్రస్) ఎందుకు నిషేధం?
  • static లోకల్ వేరియబుల్స్: ఫంక్షన్ ముగిసినా మెమరీ చెరిగిపోకుండా ఉంచే Data Segment ఆర్కిటెక్చర్.
  • static గ్లోబల్ వేరియబుల్స్ & ఇంటర్నల్ లింకేజ్: ఇతర C ఫైల్స్ నుండి వేరియబుల్స్‌ను ప్రైవేట్‌గా దాచిపెట్టే విధానం.
  • extern కీవర్డ్ & ఎక్స్‌టర్నల్ లింకేజ్: మల్టీ-ఫైల్ ప్రాజెక్టులలో (Multi-File Architecture) గ్లోబల్ వేరియబుల్స్ షేరింగ్.
  • సమగ్ర తులనాత్మక పట్టిక: 4 స్టోరేజ్ క్లాసెస్ మాస్టర్ రిఫరెన్స్ టేబుల్.
  • మెమరీ సెగ్మెంట్స్ పరిచయం: Stack, Heap, BSS, Data Segment, Code Segment.
  • సమగ్ర రియల్ వరల్డ్ ప్రాజెక్ట్: ఆటో-ఇంక్రిమెంటింగ్ యూనిక్ ట్రాన్సాక్షన్ ఐడీ & సర్వర్ సెషన్ మేనేజర్.
  • బిగినర్స్ చేసే టాప్ 5 స్కోప్ తప్పులు: గ్లోబల్ వేరియబుల్స్ సైడ్ ఎఫెక్ట్స్, extern లో ఇనిషియలైజ్ చేసే బగ్స్.
  • స్వీయ మూల్యాంకన క్విజ్: 5 లోతైన విశ్లేషణాత్మక ప్రశ్నలు & గేట్/ఎగ్జామ్ కాన్సెప్ట్స్.
2వేరియబుల్ యొక్క 4 ప్రాథమిక లక్షణాలు (The 4 Storage Attributes)

C లాంగ్వేజ్‌లో ఒక వేరియబుల్‌ను డిక్లేర్ చేసినప్పుడు, కంపైలర్ దాని గురించి 4 ముఖ్యమైన విషయాలను నిర్ధారిస్తుంది:

1. నిల్వ ప్రదేశం (Storage Location)

ఆ వేరియబుల్ భౌతికంగా ఎక్కడ నిల్వ అవుతుంది? (RAM స్టాక్ మెమరీలోనా, డేటా సెగ్మెంట్‌లోనా, లేదా CPU రిజిస్టర్‌లలోనా?).

2. డీఫాల్ట్ ప్రారంభ విలువ (Initial Value)

మనం ఎటువంటి విలువను ఇవ్వకపోతే కంపైలర్ దానికి ఏమి ఇస్తుంది? (సున్నా 0 ఇస్తుందా లేక ప్రమాదకరమైన చెత్త విలువ Garbage ఇస్తుందా?).

3. స్కోప్ / దృశ్యమానత (Scope / Visibility)

ఆ వేరియబుల్‌ను ప్రోగ్రామ్‌లోని ఏయే ఫంక్షన్లు చూడగలవు మరియు ఉపయోగించగలవు? (Local, File, or Global).

4. లైఫ్‌టైమ్ / ఆయుష్షు (Lifetime)

ఆ వేరియబుల్ మెమరీలో ఎంతకాలం సజీవంగా ఉంటుంది? (బ్లాక్ ముగిసేవరకా లేదా మొత్తం ప్రోగ్రామ్ ముగిసేవరకా?).

3లోకల్ స్కోప్ vs గ్లోబల్ స్కోప్ (Local vs Global Scope)

స్కోప్ (Scope) అనేది ఒక వేరియబుల్ యొక్క దృశ్యమానతను (Visibility) నిర్ణయిస్తుంది. C లో ప్రధానంగా రెండు స్థాయిల స్కోప్‌లు ఉంటాయి:

1. లోకల్ వేరియబుల్స్ (Block Scope):

ఏదైనా ఒక ఫంక్షన్ లేదా కర్లీ బ్రేసెస్ { ... } బ్లాక్ లోపల డిక్లేర్ చేయబడిన వేరియబుల్స్. అవి ఆ బ్లాక్ లోపల మాత్రమే పనిచేస్తాయి. ఆ బ్లాక్ ముగియగానే మెమరీ నుండి నాశనమవుతాయి.

2. గ్లోబల్ వేరియబుల్స్ (File / Program Scope):

అన్ని ఫంక్షన్ల వెలుపల (సాధారణంగా ఫైల్ పైభాగంలో) డిక్లేర్ చేయబడిన వేరియబుల్స్. వీటిని ప్రోగ్రామ్‌లోని ఏ ఫంక్షన్ అయినా నేరుగా చదవవచ్చు మరియు సవరించవచ్చు. ప్రోగ్రామ్ ప్రారంభమైనప్పటి నుండి ముగిసేవరకు ఇవి సజీవంగా ఉంటాయి.

C — Local vs Global Scope Demo
#include <stdio.h>

// గ్లోబల్ వేరియబుల్: మొత్తం ఫైల్ లో ఎక్కడి నుండైనా యాక్సెస్ చేయవచ్చు
int globalCounter = 100;

void printCounters() {
    int localVal = 20; // printCounters కి మాత్రమే పరిమితమైన లోకల్ వేరియబుల్
    printf("printCounters లోపల: localVal = %d, globalCounter = %d\n", localVal, globalCounter);
}

int main() {
    int mainLocal = 50; // main కి మాత్రమే పరిమితమైన లోకల్ వేరియబుల్

    printf("main లోపల: mainLocal = %d, globalCounter = %d\n", mainLocal, globalCounter);
    printCounters();

    // గ్లోబల్ వేరియబుల్‌ను ఇక్కడ మార్చితే ఇతర ఫంక్షన్లలోనూ మారుతుంది
    globalCounter += 50;
    printf("గ్లోబల్ మార్చిన తర్వాత: globalCounter = %d\n", globalCounter);

    return 0;
}
⚠️ గ్లోబల్ వేరియబుల్స్ ప్రమాదం (The Evils of Global Variables): పెద్ద సాఫ్ట్‌వేర్ ప్రాజెక్టులలో గ్లోబల్ వేరియబుల్స్ ఎక్కువగా వాడకూడదు! ఏ ఫంక్షన్ ఎప్పుడు ఆ విలువను మార్చిందో కనిపెట్టడం అసాధ్యమైపోయి, వింతైన సైడ్ ఎఫెక్ట్స్ (Unintended Side Effects) వస్తాయి. సాధ్యమైనంతవరకు లోకల్ వేరియబుల్స్ వాడటమే ఉత్తమ ఇంజనీరింగ్ పద్ధతి!
4వేరియబుల్ షాడోయింగ్ (Variable Shadowing / Hiding)

ఒకవేళ గ్లోబల్ వేరియబుల్ పేరుతోనే ఒక లోకల్ వేరియబుల్‌ను కూడా అదే పేరుతో డిక్లేర్ చేస్తే ఏం జరుగుతుంది? దీనినే వేరియబుల్ షాడోయింగ్ (Variable Shadowing) అంటారు.

🌓 షాడోయింగ్ రూల్: ఒక బ్లాక్ లోపల లోకల్ వేరియబుల్ ఎల్లప్పుడూ గ్లోబల్ వేరియబుల్‌పై అధిక ప్రాధాన్యతను (Higher Precedence) కలిగి ఉంటుంది! లోకల్ వేరియబుల్ గ్లోబల్ వేరియబుల్‌ను తాత్కాలికంగా నీడలా కప్పివేస్తుంది (Shadows/Hides). ఆ బ్లాక్ దాటిన తర్వాత మళ్లీ గ్లోబల్ వేరియబుల్ కనిపిస్తుంది.
C — Variable Shadowing Demo
#include <stdio.h>

int age = 40; // 1. గ్లోబల్ వేరియబుల్

int main() {
    printf("[main ప్రారంభం] గ్లోబల్ age = %d\n", age);

    int age = 25; // 2. లోకల్ వేరియబుల్ (గ్లోబల్ age ను షాడో చేస్తుంది!)
    printf("[main లోకల్ స్కోప్] లోకల్ age = %d\n", age);

    {
        int age = 10; // 3. అంతర్గత బ్లాక్ స్కోప్ (మరింత లోపలి షాడోయింగ్!)
        printf("  [లోపలి బ్లాక్] నెస్టెడ్ age = %d\n", age);
    }

    printf("[బ్లాక్ బయట] తిరిగి main లోకల్ age = %d\n", age);
    return 0;
}
5auto స్టోరేజ్ క్లాస్ — డీఫాల్ట్ లోకల్ మెకానిక్స్

C లాంగ్వేజ్‌లో ఒక ఫంక్షన్ లోపల డిక్లేర్ చేసే ప్రతి సాధారణ వేరియబుల్ డీఫాల్ట్‌గా auto (Automatic) స్టోరేజ్ క్లాస్‌కు చెందుతుంది. మీరు int x; అని రాసినా లేదా auto int x; అని రాసినా రెండూ పూర్తిగా ఒకటే!

  • నిల్వ ప్రదేశం: RAM లోని Stack Segment లో కేటాయించబడుతుంది.
  • డీఫాల్ట్ విలువ: గార్బేజ్ విలువ (Garbage Value / Undefined)! ప్రారంభ విలువను మనం ఇవ్వకపోతే అందులో గతంలో వాడిన చెత్త విలువ ఉంటుంది.
  • స్కోప్: బ్లాక్ స్కోప్ (కేవలం ఆ కర్లీ బ్రేసెస్ లోపల మాత్రమే).
  • లైఫ్‌టైమ్: ఫంక్షన్ ఎగ్జిక్యూషన్ ముగియగానే ఆ వేరియబుల్ మెమరీ ఆటోమేటిక్‌గా డిలీట్ అవుతుంది.
⚠️ బిగినర్స్ ట్రాప్: auto వేరియబుల్స్‌ను డిక్లేర్ చేసిన వెంటనే int count = 0; అని ఇనిషియలైజ్ చేయాలి! అలా చేయకుండా నేరుగా count++ చేస్తే గార్బేజ్ విలువతో కూడిక జరిగి ఊహించని తప్పుడు సమాధానాలు వస్తాయి!
6register స్టోరేజ్ క్లాస్ & CPU కాష్ స్పీడ్

సాధారణ వేరియబుల్స్ RAM మెమరీలో ఉంటాయి. RAM నుండి CPU ప్రాసెసర్ లోపలికి డేటాను తీసుకురావడానికి కొన్ని క్లాక్ సైకిల్స్ సమయం పడుతుంది. ఒక వేరియబుల్‌ను లూప్‌లో కోట్లాది సార్లు అమిత వేగంతో యాక్సెస్ చేయాల్సి వస్తే, దానిని RAM లో కాకుండా నేరుగా CPU రిజిస్టర్లలో (CPU Registers) భద్రపరచమని కంపైలర్‌ను కోరడానికి register కీవర్డ్ ఉపయోగిస్తారు!

C — Register Storage Class Usage
#include <stdio.h>

int main() {
    // లూప్ కౌంటర్‌ను నేరుగా CPU రిజిస్టర్‌లో ఉంచమని రిక్వెస్ట్ చేస్తున్నాం
    register int i;
    long long sum = 0;

    for (i = 1; i <= 1000000; i++) {
        sum += i;
    }

    printf("1 నుండి 10 లక్షల వరకు మొత్తం = %lld\n", sum);
    return 0;
}

⚠️ register వేరియబుల్స్ పై కఠినమైన నిషేధం:

మీరు register వేరియబుల్ యొక్క మెమరీ అడ్రస్ (&) ను ఎప్పటికీ తీసుకోలేరు! ఎందుకంటే CPU రిజిస్టర్లకు RAM మెమరీ చిరునామాలు ఉండవు. మీరు &i అని రాయడానికి ప్రయత్నిస్తే GCC కంపైలర్ వెంటనే: error: address of register variable 'i' requested అని ఎర్రర్ ఇచ్చి ఆపేస్తుంది! అంతేకాకుండా, register అనేది కంపైలర్‌కు ఇచ్చే ఒక సిఫార్సు (Hint) మాత్రమే; CPU లో రిజిస్టర్లు ఖాళీగా లేకపోతే కంపైలర్ దానిని సాధారణ auto వేరియబుల్‌గా పరిగణిస్తుంది.

7static లోకల్ వేరియబుల్స్ — నిలిచి ఉండే సూపర్ పవర్

C ప్రోగ్రామింగ్‌లోనే అత్యంత ఉపయోగకరమైన స్టోరేజ్ క్లాస్ static. ఒక లోకల్ వేరియబుల్ ముందు static అని పెడితే దానికి ఒక వింతైన శక్తీ వస్తుంది:

🌟 static లోకల్ వేరియబుల్ నియమం: ఫంక్షన్ ఎగ్జిక్యూషన్ ముగిసినప్పటికీ, ఈ వేరియబుల్ మెమరీ నుండి నాశనం కాదు! అది తన చివరి విలువను భద్రంగా గుర్తుపెట్టుకుంటుంది. మళ్లీ ఆ ఫంక్షన్‌ను పిలిచినప్పుడు ఆ పాత విలువతోనే కొనసాగుతుంది!

క్రింది ఉదాహరణలో సాధారణ auto వేరియబుల్‌కు మరియు static వేరియబుల్‌కు మధ్య ఉన్న భారీ వ్యత్యాసాన్ని పరిశీలించండి:

C — Normal Local vs Static Local Variable
#include <stdio.h>

void demoFunction() {
    int normalCount = 0;        // సాధారణ auto వేరియబుల్ (ప్రతిసారీ కొత్తగా పుడుతుంది)
    static int staticCount = 0; // static వేరియబుల్ (ప్రోగ్రామ్ ప్రారంభంలో ఒకేసారి ఇనిషియలైజ్ అవుతుంది!)

    normalCount++;
    staticCount++;

    printf("normalCount = %d  |  staticCount = %d\n", normalCount, staticCount);
}

int main() {
    printf("--- మొదటి కాల్ ---\n");
    demoFunction();

    printf("--- రెండవ కాల్ ---\n");
    demoFunction();

    printf("--- మూడవ కాల్ ---\n");
    demoFunction();

    return 0;
}
అవుట్‌పుట్:
--- మొదటి కాల్ --- ➔ normalCount = 1 | staticCount = 1
--- రెండవ కాల్ --- ➔ normalCount = 1 | staticCount = 2
--- మూడవ కాల్ --- ➔ normalCount = 1 | staticCount = 3
చూశారా? normalCount ప్రతిసారీ చనిపోయి మళ్లీ 1 అవుతుంటే, staticCount మాత్రం తన మునుపటి విలువను గుర్తుపెట్టుకుని పెరుగుతూనే ఉంది!
8static గ్లోబల్ వేరియబుల్స్ & ఇంటర్నల్ లింకేజ్ (Internal Linkage)

static కీవర్డ్‌ను ఫంక్షన్ల వెలుపల ఒక గ్లోబల్ వేరియబుల్ లేదా ఫంక్షన్ ముందు పెడితే దాని అర్థం పూర్తిగా మారిపోతుంది! దీనిని ఇంటర్నల్ లింకేజ్ (Internal Linkage / File Scope) అంటారు.

ఒక పెద్ద ప్రాజెక్ట్‌లో అనేక .c ఫైల్స్ ఉంటాయి. ఒక ఫైల్‌లో ఉన్న గ్లోబల్ వేరియబుల్‌ను ఇతర ఫైల్స్ చూడకూడదు, కేవలం ఆ ఒక్క ఫైల్‌కు మాత్రమే పరిమితం కావాలి (Data Hiding / Encapsulation) అనుకుంటే దాని ముందు static ఉంచుతారు:

C — Internal Linkage with static Global
// file1.c లోపల:
static int internalDatabaseKey = 9482; // ఈ వేరియబుల్ కేవలం file1.c కి మాత్రమే పరిమితం!

// ఇతర ఫైల్స్ (file2.c) లో extern ద్వారా కూడా దీనిని యాక్సెస్ చేయడం అసాధ్యం!
static void privateHelperFunction() {
    // ఈ ఫంక్షన్ కూడా ఫైల్ వెలుపలికి కనిపించదు (Private Function)
}
9extern కీవర్డ్ & ఎక్స్‌టర్నల్ లింకేజ్ (Multi-File Projects)

ఆధునిక సాఫ్ట్‌వేర్ అభివృద్ధిలో వేలాది లైన్ల కోడ్ వేర్వేరు ఫైల్స్‌గా విభజించబడుతుంది. ఒక ఫైల్‌లో డిక్లేర్ చేసిన గ్లోబల్ వేరియబుల్‌ను మరొక ఫైల్‌లో ఉపయోగించాలంటే extern (External Linkage) కీవర్డ్ తప్పనిసరి!

డిక్లరేషన్ vs డెఫినిషన్ వ్యత్యాసం:

int sharedCounter = 10; అని రాస్తే అది డెఫినిషన్ (మెమరీ కేటాయించబడుతుంది).
కానీ వేరే ఫైల్‌లో extern int sharedCounter; అని రాస్తే అది కేవలం డిక్లరేషన్ మాత్రమే! కంపైలర్‌కు ఇలా చెబుతున్నాం: "ఈ వేరియబుల్ కోసం కొత్తగా మెమరీ కేటాయించకు; ఇది ఇప్పటికే వేరొక ఫైల్‌లో ఉంది, లింకర్ దానిని కలుపుతుంది!"

C — Multi-File Architecture with extern
// ============================================
// ఫైల్ 1: server_config.c (అసలైన డెఫినిషన్)
// ============================================
int serverMaxClients = 500; // గ్లోబల్ వేరియబుల్ డెఫినిషన్

// ============================================
// ఫైల్ 2: client_handler.c (extern డిక్లరేషన్)
// ============================================
#include <stdio.h>

// వేరొక ఫైల్‌లోని వేరియబుల్‌ను ఇక్కడ వాడుకోవడానికి extern డిక్లరేషన్
extern int serverMaxClients;

void checkCapacity(int currentClients) {
    if (currentClients >= serverMaxClients) {
        printf("🚨 సర్వర్ ఫుల్ అయింది! పరిమితి: %d క్లయింట్లు.\n", serverMaxClients);
    } else {
        printf("✅ కనెక్షన్ అనుమతించబడింది. మిగిలిన ఖాళీలు: %d\n", serverMaxClients - currentClients);
    }
}

int main() {
    checkCapacity(350);
    checkCapacity(500);
    return 0;
}
10సమగ్ర తులనాత్మక పట్టిక (The 4 Storage Classes Master Table)

C లోని నాలుగు స్టోరేజ్ క్లాసుల పూర్తి సాంకేతిక వివరాలను క్రింది మాస్టర్ రిఫరెన్స్ టేబుల్‌లో పోల్చి చూడండి:

స్టోరేజ్ క్లాస్ మెమరీ ప్రదేశం (Location) డీఫాల్ట్ ప్రారంభ విలువ స్కోప్ (Scope) లైఫ్‌టైమ్ (Lifetime)
auto RAM (Stack Segment) గార్బేజ్ విలువ (Garbage) లోకల్ / బ్లాక్ స్కోప్ ఫంక్షన్ ముగిసేవరకు మాత్రమే
register CPU Registers (లేదా Stack) గార్బేజ్ విలువ (Garbage) లోకల్ / బ్లాక్ స్కోప్ ఫంక్షన్ ముగిసేవరకు మాత్రమే
static (లోకల్) RAM (Data / BSS Segment) సున్నా (0) లోకల్ / బ్లాక్ స్కోప్ మొత్తం ప్రోగ్రామ్ ముగిసేవరకు
static (గ్లోబల్) RAM (Data / BSS Segment) సున్నా (0) ఫైల్ స్కోప్ (ఇంటర్నల్ లింకేజ్) మొత్తం ప్రోగ్రామ్ ముగిసేవరకు
extern RAM (Data / BSS Segment) సున్నా (0) గ్లోబల్ (ఎక్స్‌టర్నల్ లింకేజ్) మొత్తం ప్రోగ్రామ్ ముగిసేవరకు
11సమగ్ర రియల్ వరల్డ్ ప్రాజెక్ట్ — యూనిక్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్ & సెషన్ ఇంజిన్

ఇప్పటివరకు నేర్చుకున్న static, auto, మరియు స్కోప్ నియమాలను ఉపయోగించి ఒక వాస్తవ బ్యాంకింగ్ యూనిక్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్ & యాక్టివ్ సెషన్ ట్రాకర్ (Transaction ID Engine) ను నిర్మిద్దాం. ప్రతిసారీ ఒక ట్రాన్సాక్షన్ జరిగినప్పుడు అది మునుపటి కౌంటర్‌ను గుర్తుపెట్టుకుని సరికొత్త సీరియల్ నంబర్‌ను ఉత్పత్తి చేయాలి:

C — Unique Transaction ID & Session Audit Engine
#include <stdio.h>

// యూనిక్ ట్రాన్సాక్షన్ ఐడీ ఉత్పత్తి చేసే కోర్ ఇంజిన్ (static వినియోగం)
long long generateNextTxnID() {
    // ప్రారంభ ట్రాన్సాక్షన్ బేస్ నంబర్: TXN-2026-0001
    static long long currentSerial = 20260000;
    currentSerial++; // ప్రతి కాల్ కి శాశ్వతంగా 1 పెరుగుతుంది
    return currentSerial;
}

// ఒక ఖాతా నుండి నగదు బదిలీని ఆడిట్ చేసే ఫంక్షన్
void executePayment(const char* payer, const char* payee, double amount) {
    long long txnId = generateNextTxnID(); // యూనిక్ ఐడీని పొందుతున్నాం
    static double totalVolumeProcessed = 0.0; // మొత్తం బ్యాంక్ బిజినెస్ వాల్యూమ్
    static int successfulTxnCount = 0;

    totalVolumeProcessed += amount;
    successfulTxnCount++;

    printf("====================================================\n");
    printf("   ట్రాన్సాక్షన్ రసీదు #TXN-%lld\n", txnId);
    printf("====================================================\n");
    printf("   చెల్లింపుదారు (From) : %s\n", payer);
    printf("   స్వీకర్త (To)        : %s\n", payee);
    printf("   మొత్తం (Amount)      : రూ. %.2f\n", amount);
    printf("   స్టేటస్              : ✅ సక్సెస్ (ధృవీకరించబడింది)\n");
    printf("----------------------------------------------------\n");
    printf("   [ఆడిట్ లాగ్] నేటి మొత్తం లావాదేవీలు: %d\n", successfulTxnCount);
    printf("   [ఆడిట్ లాగ్] నేటి మొత్తం టర్నోవర్   : రూ. %.2f\n", totalVolumeProcessed);
    printf("====================================================\n\n");
}

int main() {
    printf("🏦 మనా పేమెంట్స్ కోర్ గేట్‌వే ఆన్‌లైన్ (2026 Academic)\n\n");

    // వరుసగా 3 లావాదేవీలను రన్ చేద్దాం
    executePayment("విక్రమ్ రెడ్డి", "అమేజాన్ ఇండియా", 3499.00);
    executePayment("సుజాత రావు", "ఫ్లిప్‌కార్ట్ ప్రైవేట్ లిమిటెడ్", 12500.00);
    executePayment("ఆదిత్య వర్మ", "స్విగ్గీ ఫుడ్స్", 450.00);

    return 0;
}
12సాధారణంగా బిగినర్స్ చేసే టాప్ 5 స్కోప్ & స్టోరేజ్ తప్పులు
1. అన్‌ఇనిషియలైజ్డ్ ఆటో వేరియబుల్స్ వాడటం:
int sum; అని డిక్లేర్ చేసి సున్నా ఇవ్వకుండా నేరుగా కూడికలు చేస్తే చెత్త విలువలతో తప్పుడు గణనలు వస్తాయి.
2. extern వేరియబుల్‌ను డిక్లరేషన్‌లోనే ఇనిషియలైజ్ చేయడం:
extern int x = 10; అని రాస్తే అది డిక్లరేషన్ కాకుండా డెఫినిషన్ అయిపోయి లింకర్ 'multiple definition of x' ఎర్రర్ విసురుతుంది!
3. register వేరియబుల్ కు & ఆపరేటర్ వాడటం:
register int reg; scanf("%d", &reg); అని రాస్తే కంపైల్ కాదు! CPU రిజిస్టర్లకు మెమరీ అడ్రస్ ఉండదు.
4. static వేరియబుల్ ను రన్‌టైమ్ వేరియబుల్‌తో ఇనిషియలైజ్ చేయాలనుకోవడం:
static int x = getUserInput(); అని C లో రాయకూడదు! static వేరియబుల్స్ కంపైల్-టైమ్ స్థిర విలువలతో (Constants) మాత్రమే ఇనిషియలైజ్ కావాలి.
5. వేరియబుల్ షాడోయింగ్ వలన గ్లోబల్ వేరియబుల్ మిస్ అవ్వడం:
లోపల అదే పేరుతో వేరియబుల్ ఉన్నప్పుడు, మీరు గ్లోబల్ అనుకుని మార్చింది లోకల్ కే పరిమితమై బగ్స్ ఏర్పడతాయి.
13స్వీయ మూల్యాంకన క్విజ్ & మీరే స్వయంగా Try చేయండి!

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

❓ ప్రశ్న 1: auto మరియు static లోకల్ వేరియబుల్స్ మధ్య ముఖ్యమైన తేడా ఏమిటి?
సమాధానం: auto వేరియబుల్ ఫంక్షన్ ముగియగానే నాశనమవుతుంది (డీఫాల్ట్ విలువ గార్బేజ్). కానీ static వేరియబుల్ ఫంక్షన్ ముగిసినా తన చివరి విలువను గుర్తుపెట్టుకుని ప్రోగ్రామ్ ముగిసేవరకు నిలిచి ఉంటుంది (డీఫాల్ట్ విలువ 0).
❓ ప్రశ్న 2: register వేరియబుల్ యొక్క అడ్రస్ (&var) ను ఎందుకు తీసుకోలేము?
సమాధానం: register వేరియబుల్స్ RAM లో కాకుండా నేరుగా CPU రిజిస్టర్లలో నిల్వ చేయబడతాయి. CPU రిజిస్టర్లకు మెమరీ అడ్రస్ ఉండదు కాబట్టి & ఆపరేటర్ వాడటం చట్టవిరుద్ధం (Compile Error).
❓ ప్రశ్న 3: ఒక గ్లోబల్ వేరియబుల్ ముందు 'static' పెడితే ఏం జరుగుతుంది?
సమాధానం: అది ఇంటర్నల్ లింకేజ్ (Internal Linkage) ను పొందుతుంది. అంటే ఆ వేరియబుల్ కేవలం ఆ ఒక్క ఫైల్‌కు మాత్రమే పరిమితమవుతుంది; ఇతర ఫైల్స్ దానిని యాక్సెస్ చేయలేవు (File Encapsulation).
❓ ప్రశ్న 4: మల్టీ-ఫైల్ ప్రాజెక్టులలో extern కీవర్డ్ యొక్క పాత్ర ఏమిటి?
సమాధానం: వేరొక C సోర్స్ ఫైల్‌లో ఇప్పటికే డిఫైన్ చేయబడిన గ్లోబల్ వేరియబుల్‌ను ప్రస్తుత ఫైల్‌లో మెమరీ డూప్లికేషన్ లేకుండా వాడుకోవడానికి (External Linkage) extern డిక్లరేషన్ ఉపయోగిస్తారు.
❓ ప్రశ్న 5: static వేరియబుల్స్ RAM లో ఏ మెమరీ సెగ్మెంట్ లో నిల్వ చేయబడతాయి?
సమాధానం: అవి స్టాక్ (Stack) పై ఉండవు. ఇనిషియలైజ్ చేయబడితే Data Segment లోను, ఇనిషియలైజ్ చేయకపోతే BSS Segment లోను నిల్వ చేయబడతాయి.
🚀 యూనిక్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్‌ను మన ఆన్‌లైన్ C కంపైలర్‌లో రన్ చేయండి!

పైన వివరించిన ట్రాన్సాక్షన్ ఐడీ & ఆడిట్ సిస్టమ్ కోడ్‌ను మన ఆన్‌లైన్ C కంపైలర్‌లో ఓపెన్ చేసి స్వయంగా రన్ చేయండి. కొత్త ట్రాన్సాక్షన్లను పిలిచి స్టాటిక్ కౌంటర్లు ఎలా పెరుగుతున్నాయో గమనించండి!

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

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

  • స్కోప్ & లైఫ్‌టైమ్: వేరియబుల్ ఎక్కడ కనిపిస్తుంది మరియు ఎంతకాలం బ్రతుకుతుందో నిర్ణయిస్తాయి.
  • auto: సాధారణ లోకల్ వేరియబుల్స్; స్టాక్ పై ఉంటాయి, డీఫాల్ట్‌గా గార్బేజ్ విలువను కలిగి ఉంటాయి.
  • register: CPU రిజిస్టర్లలో వేగవంతమైన లూప్ ఆపరేషన్లకు ఉపయోగిస్తారు; అడ్రస్ తీసుకోలేము.
  • static: ఫంక్షన్ కాల్స్ మధ్య విలువలను శాశ్వతంగా నిలిపి ఉంచుతుంది; డీఫాల్ట్ విలువ 0.
  • extern: మల్టీ-ఫైల్ ప్రాజెక్టులలో గ్లోబల్ వేరియబుల్స్‌ను పంచుకోవడానికి లింకర్‌తో అనుసంధానిస్తుంది.
తర్వాతి అధ్యాయంలో (Chapter 12 — Phase 03 ముగింపు): కంప్యూటర్ సైన్స్‌లోనే అత్యంత ఆకర్షణీయమైన అల్గారిథమిక్ భావన — రికార్షన్ (Recursion), బేస్ కండిషన్, ఫ్యాక్టోరియల్/ఫిబోనాచీ మరియు స్టాక్ ఓవర్‌ఫ్లో (Stack Overflow) గురించి అద్భుతంగా నేర్చుకుందాం!
← Prev: 10. Call by Value vs Reference Next: 12. రికార్షన్ & కాల్ స్టాక్ →
OC
Written by Our Compiler Technical Editorial Team
Reviewed for accuracy & tested on GCC 13+ / Clang 17 runtime · 2026 Academic Edition