వేరియబుల్ స్కోప్, లైఫ్టైమ్ & స్టోరేజ్ క్లాసెస్
ఒక మనిషి యొక్క గుర్తింపు మరియు అధికారాన్ని ఊహించుకోండి. మీ ఇంట్లోని బెడ్రూమ్లో మీ వ్యక్తిగత డైరీ లేదా వస్తువులు ఉంటాయి. వాటిని కేవలం ఆ గది లోపల మాత్రమే మీరు చూసుకోగలరు; బయటి వీధిలోకి వెళ్తే ఎవరికీ కనిపించవు. ఇది లోకల్ స్కోప్ (Local Scope). అదే మీ గ్రామ పంచాయతీ లేదా కాలేజీ నోటీస్ బోర్డుపై ఉన్న సమాచారాన్ని ఆ ఊరిలోని ప్రతి పౌరుడూ చూడగలడు, దానిని ఎవరైనా మార్చవచ్చు. ఇది గ్లోబల్ స్కోప్ (Global Scope).
మరి ఒక పెద్ద గ్రంథాలయంలోని (Library) విజిటర్స్ లాగ్ బుక్ (Visitor Counter) ఎలాంటిది? ప్రతిరోజూ వందలాది మంది పాఠకులు వచ్చి పుస్తకాలు చదివి ఇంటికి వెళ్లిపోతారు (ఫంక్షన్ కాల్స్ ముగిసినట్లు). పాఠకులు వచ్చి వెళ్లినా, ఆ లాగ్ బుక్లోని మొత్తం కౌంటర్ అలాగే స్థిరంగా పెరుగుతూ నిల్వ ఉంటుంది తప్ప పాఠకుడు వెళ్లగానే సున్నా అవ్వదు! ఇది C లోని static వేరియబుల్ సూపర్ పవర్!
కంప్యూటర్ ప్రోగ్రామింగ్లో ఒక వేరియబుల్ RAM లో ఎక్కడ దాగి ఉంటుంది? దాని ప్రారంభ విలువ ఏమిటి? అది ఎంతసేపు బ్రతుకుతుంది? ప్రోగ్రామ్లోని ఏయే భాగాలు దానిని తాకగలవు? అనే నాలుగు పరమ రహస్యాలను నిర్ణయించేవే స్టోరేజ్ క్లాసెస్ (Storage Classes: auto, static, extern, register). ఈ పదకొండవ అధ్యాయంలో, మెమరీ సెగ్మెంట్స్, మల్టీ-ఫైల్ ప్రాజెక్ట్ లింకేజ్ మరియు సురక్షితమైన యూనిక్ బ్యాంకింగ్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్ ప్రాజెక్ట్ను లోతుగా నేర్చుకుందాం!
సిస్టమ్స్ లెవల్ 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 లోతైన విశ్లేషణాత్మక ప్రశ్నలు & గేట్/ఎగ్జామ్ కాన్సెప్ట్స్.
C లాంగ్వేజ్లో ఒక వేరియబుల్ను డిక్లేర్ చేసినప్పుడు, కంపైలర్ దాని గురించి 4 ముఖ్యమైన విషయాలను నిర్ధారిస్తుంది:
1. నిల్వ ప్రదేశం (Storage Location)
ఆ వేరియబుల్ భౌతికంగా ఎక్కడ నిల్వ అవుతుంది? (RAM స్టాక్ మెమరీలోనా, డేటా సెగ్మెంట్లోనా, లేదా CPU రిజిస్టర్లలోనా?).
2. డీఫాల్ట్ ప్రారంభ విలువ (Initial Value)
మనం ఎటువంటి విలువను ఇవ్వకపోతే కంపైలర్ దానికి ఏమి ఇస్తుంది? (సున్నా 0 ఇస్తుందా లేక ప్రమాదకరమైన చెత్త విలువ Garbage ఇస్తుందా?).
3. స్కోప్ / దృశ్యమానత (Scope / Visibility)
ఆ వేరియబుల్ను ప్రోగ్రామ్లోని ఏయే ఫంక్షన్లు చూడగలవు మరియు ఉపయోగించగలవు? (Local, File, or Global).
4. లైఫ్టైమ్ / ఆయుష్షు (Lifetime)
ఆ వేరియబుల్ మెమరీలో ఎంతకాలం సజీవంగా ఉంటుంది? (బ్లాక్ ముగిసేవరకా లేదా మొత్తం ప్రోగ్రామ్ ముగిసేవరకా?).
స్కోప్ (Scope) అనేది ఒక వేరియబుల్ యొక్క దృశ్యమానతను (Visibility) నిర్ణయిస్తుంది. C లో ప్రధానంగా రెండు స్థాయిల స్కోప్లు ఉంటాయి:
1. లోకల్ వేరియబుల్స్ (Block Scope):
ఏదైనా ఒక ఫంక్షన్ లేదా కర్లీ బ్రేసెస్ { ... } బ్లాక్ లోపల డిక్లేర్ చేయబడిన వేరియబుల్స్. అవి ఆ బ్లాక్ లోపల మాత్రమే పనిచేస్తాయి. ఆ బ్లాక్ ముగియగానే మెమరీ నుండి నాశనమవుతాయి.
2. గ్లోబల్ వేరియబుల్స్ (File / Program Scope):
అన్ని ఫంక్షన్ల వెలుపల (సాధారణంగా ఫైల్ పైభాగంలో) డిక్లేర్ చేయబడిన వేరియబుల్స్. వీటిని ప్రోగ్రామ్లోని ఏ ఫంక్షన్ అయినా నేరుగా చదవవచ్చు మరియు సవరించవచ్చు. ప్రోగ్రామ్ ప్రారంభమైనప్పటి నుండి ముగిసేవరకు ఇవి సజీవంగా ఉంటాయి.
#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;
}
ఒకవేళ గ్లోబల్ వేరియబుల్ పేరుతోనే ఒక లోకల్ వేరియబుల్ను కూడా అదే పేరుతో డిక్లేర్ చేస్తే ఏం జరుగుతుంది? దీనినే వేరియబుల్ షాడోయింగ్ (Variable Shadowing) అంటారు.
#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;
}
C లాంగ్వేజ్లో ఒక ఫంక్షన్ లోపల డిక్లేర్ చేసే ప్రతి సాధారణ వేరియబుల్ డీఫాల్ట్గా auto (Automatic) స్టోరేజ్ క్లాస్కు చెందుతుంది. మీరు int x; అని రాసినా లేదా auto int x; అని రాసినా రెండూ పూర్తిగా ఒకటే!
- నిల్వ ప్రదేశం: RAM లోని Stack Segment లో కేటాయించబడుతుంది.
- డీఫాల్ట్ విలువ: గార్బేజ్ విలువ (Garbage Value / Undefined)! ప్రారంభ విలువను మనం ఇవ్వకపోతే అందులో గతంలో వాడిన చెత్త విలువ ఉంటుంది.
- స్కోప్: బ్లాక్ స్కోప్ (కేవలం ఆ కర్లీ బ్రేసెస్ లోపల మాత్రమే).
- లైఫ్టైమ్: ఫంక్షన్ ఎగ్జిక్యూషన్ ముగియగానే ఆ వేరియబుల్ మెమరీ ఆటోమేటిక్గా డిలీట్ అవుతుంది.
auto వేరియబుల్స్ను డిక్లేర్ చేసిన వెంటనే int count = 0; అని ఇనిషియలైజ్ చేయాలి! అలా చేయకుండా నేరుగా count++ చేస్తే గార్బేజ్ విలువతో కూడిక జరిగి ఊహించని తప్పుడు సమాధానాలు వస్తాయి!
సాధారణ వేరియబుల్స్ RAM మెమరీలో ఉంటాయి. RAM నుండి CPU ప్రాసెసర్ లోపలికి డేటాను తీసుకురావడానికి కొన్ని క్లాక్ సైకిల్స్ సమయం పడుతుంది. ఒక వేరియబుల్ను లూప్లో కోట్లాది సార్లు అమిత వేగంతో యాక్సెస్ చేయాల్సి వస్తే, దానిని RAM లో కాకుండా నేరుగా CPU రిజిస్టర్లలో (CPU Registers) భద్రపరచమని కంపైలర్ను కోరడానికి register కీవర్డ్ ఉపయోగిస్తారు!
#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 వేరియబుల్గా పరిగణిస్తుంది.
C ప్రోగ్రామింగ్లోనే అత్యంత ఉపయోగకరమైన స్టోరేజ్ క్లాస్ static. ఒక లోకల్ వేరియబుల్ ముందు static అని పెడితే దానికి ఒక వింతైన శక్తీ వస్తుంది:
క్రింది ఉదాహరణలో సాధారణ auto వేరియబుల్కు మరియు static వేరియబుల్కు మధ్య ఉన్న భారీ వ్యత్యాసాన్ని పరిశీలించండి:
#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 మాత్రం తన మునుపటి విలువను గుర్తుపెట్టుకుని పెరుగుతూనే ఉంది!
static కీవర్డ్ను ఫంక్షన్ల వెలుపల ఒక గ్లోబల్ వేరియబుల్ లేదా ఫంక్షన్ ముందు పెడితే దాని అర్థం పూర్తిగా మారిపోతుంది! దీనిని ఇంటర్నల్ లింకేజ్ (Internal Linkage / File Scope) అంటారు.
ఒక పెద్ద ప్రాజెక్ట్లో అనేక .c ఫైల్స్ ఉంటాయి. ఒక ఫైల్లో ఉన్న గ్లోబల్ వేరియబుల్ను ఇతర ఫైల్స్ చూడకూడదు, కేవలం ఆ ఒక్క ఫైల్కు మాత్రమే పరిమితం కావాలి (Data Hiding / Encapsulation) అనుకుంటే దాని ముందు static ఉంచుతారు:
// file1.c లోపల:
static int internalDatabaseKey = 9482; // ఈ వేరియబుల్ కేవలం file1.c కి మాత్రమే పరిమితం!
// ఇతర ఫైల్స్ (file2.c) లో extern ద్వారా కూడా దీనిని యాక్సెస్ చేయడం అసాధ్యం!
static void privateHelperFunction() {
// ఈ ఫంక్షన్ కూడా ఫైల్ వెలుపలికి కనిపించదు (Private Function)
}
ఆధునిక సాఫ్ట్వేర్ అభివృద్ధిలో వేలాది లైన్ల కోడ్ వేర్వేరు ఫైల్స్గా విభజించబడుతుంది. ఒక ఫైల్లో డిక్లేర్ చేసిన గ్లోబల్ వేరియబుల్ను మరొక ఫైల్లో ఉపయోగించాలంటే extern (External Linkage) కీవర్డ్ తప్పనిసరి!
డిక్లరేషన్ vs డెఫినిషన్ వ్యత్యాసం:
int sharedCounter = 10; అని రాస్తే అది డెఫినిషన్ (మెమరీ కేటాయించబడుతుంది).
కానీ వేరే ఫైల్లో extern int sharedCounter; అని రాస్తే అది కేవలం డిక్లరేషన్ మాత్రమే! కంపైలర్కు ఇలా చెబుతున్నాం: "ఈ వేరియబుల్ కోసం కొత్తగా మెమరీ కేటాయించకు; ఇది ఇప్పటికే వేరొక ఫైల్లో ఉంది, లింకర్ దానిని కలుపుతుంది!"
// ============================================
// ఫైల్ 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;
}
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) | గ్లోబల్ (ఎక్స్టర్నల్ లింకేజ్) | మొత్తం ప్రోగ్రామ్ ముగిసేవరకు |
ఇప్పటివరకు నేర్చుకున్న static, auto, మరియు స్కోప్ నియమాలను ఉపయోగించి ఒక వాస్తవ బ్యాంకింగ్ యూనిక్ ట్రాన్సాక్షన్ ఐడీ జనరేటర్ & యాక్టివ్ సెషన్ ట్రాకర్ (Transaction ID 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;
}
int sum; అని డిక్లేర్ చేసి సున్నా ఇవ్వకుండా నేరుగా కూడికలు చేస్తే చెత్త విలువలతో తప్పుడు గణనలు వస్తాయి.
extern int x = 10; అని రాస్తే అది డిక్లరేషన్ కాకుండా డెఫినిషన్ అయిపోయి లింకర్ 'multiple definition of x' ఎర్రర్ విసురుతుంది!
register int reg; scanf("%d", ®); అని రాస్తే కంపైల్ కాదు! CPU రిజిస్టర్లకు మెమరీ అడ్రస్ ఉండదు.
static int x = getUserInput(); అని C లో రాయకూడదు! static వేరియబుల్స్ కంపైల్-టైమ్ స్థిర విలువలతో (Constants) మాత్రమే ఇనిషియలైజ్ కావాలి.
లోపల అదే పేరుతో వేరియబుల్ ఉన్నప్పుడు, మీరు గ్లోబల్ అనుకుని మార్చింది లోకల్ కే పరిమితమై బగ్స్ ఏర్పడతాయి.
ఈ పాఠంలోని లోతైన అంశాలను క్రింది 5 ప్రాక్టికల్ ప్రశ్నల ద్వారా పరీక్షించుకోండి:
❓ ప్రశ్న 1: auto మరియు static లోకల్ వేరియబుల్స్ మధ్య ముఖ్యమైన తేడా ఏమిటి?
auto వేరియబుల్ ఫంక్షన్ ముగియగానే నాశనమవుతుంది (డీఫాల్ట్ విలువ గార్బేజ్). కానీ static వేరియబుల్ ఫంక్షన్ ముగిసినా తన చివరి విలువను గుర్తుపెట్టుకుని ప్రోగ్రామ్ ముగిసేవరకు నిలిచి ఉంటుంది (డీఫాల్ట్ విలువ 0).
❓ ప్రశ్న 2: register వేరియబుల్ యొక్క అడ్రస్ (&var) ను ఎందుకు తీసుకోలేము?
register వేరియబుల్స్ RAM లో కాకుండా నేరుగా CPU రిజిస్టర్లలో నిల్వ చేయబడతాయి. CPU రిజిస్టర్లకు మెమరీ అడ్రస్ ఉండదు కాబట్టి & ఆపరేటర్ వాడటం చట్టవిరుద్ధం (Compile Error).
❓ ప్రశ్న 3: ఒక గ్లోబల్ వేరియబుల్ ముందు 'static' పెడితే ఏం జరుగుతుంది?
❓ ప్రశ్న 4: మల్టీ-ఫైల్ ప్రాజెక్టులలో extern కీవర్డ్ యొక్క పాత్ర ఏమిటి?
extern డిక్లరేషన్ ఉపయోగిస్తారు.
❓ ప్రశ్న 5: static వేరియబుల్స్ RAM లో ఏ మెమరీ సెగ్మెంట్ లో నిల్వ చేయబడతాయి?
పైన వివరించిన ట్రాన్సాక్షన్ ఐడీ & ఆడిట్ సిస్టమ్ కోడ్ను మన ఆన్లైన్ C కంపైలర్లో ఓపెన్ చేసి స్వయంగా రన్ చేయండి. కొత్త ట్రాన్సాక్షన్లను పిలిచి స్టాటిక్ కౌంటర్లు ఎలా పెరుగుతున్నాయో గమనించండి!
📌 అధ్యాయ సారాంశం (Quick Summary):
- స్కోప్ & లైఫ్టైమ్: వేరియబుల్ ఎక్కడ కనిపిస్తుంది మరియు ఎంతకాలం బ్రతుకుతుందో నిర్ణయిస్తాయి.
- auto: సాధారణ లోకల్ వేరియబుల్స్; స్టాక్ పై ఉంటాయి, డీఫాల్ట్గా గార్బేజ్ విలువను కలిగి ఉంటాయి.
- register: CPU రిజిస్టర్లలో వేగవంతమైన లూప్ ఆపరేషన్లకు ఉపయోగిస్తారు; అడ్రస్ తీసుకోలేము.
- static: ఫంక్షన్ కాల్స్ మధ్య విలువలను శాశ్వతంగా నిలిపి ఉంచుతుంది; డీఫాల్ట్ విలువ 0.
- extern: మల్టీ-ఫైల్ ప్రాజెక్టులలో గ్లోబల్ వేరియబుల్స్ను పంచుకోవడానికి లింకర్తో అనుసంధానిస్తుంది.