By now, you know how to declare, define, and use
functions in C.
But here’s a twist: what happens to the variables you declare inside
them?
Do they live forever? Are they accessible from other functions? Or do they
vanish into thin air after use?
Let’s uncover the mysteries of scope, lifetime, and storage classes — the backstage heroes of every C program
🧭 1. What Is Variable Scope?
Scope means the region of the program where a
variable is accessible.
There are two major types of scope:
🔹 Local Scope
A variable declared inside a function (or a block {
}) is local to that function.
It can’t be accessed outside it.
Example:
#include <stdio.h>
void showNumber() { int num = 10; // Local variable printf("Inside function: %d\n", num);}
int main() { showNumber(); // printf("%d", num); // ❌ Error! num is not accessible here return 0;}
Output:
Inside function: 10
Local variables are like secret agents — they exist and
vanish quietly after their mission ends.
🔹 Global Scope
A variable declared outside all functions is a global
variable.
It can be accessed by any function in the program.
Example:
#include <stdio.h>
int counter = 0; // Global variable
void increment() { counter++;}
int main() { increment(); increment(); printf("Counter = %d\n", counter); return 0;}
Output:
Counter = 2
Global variables are like VIPs — visible everywhere, but if misused, they can cause chaos!
🕰️ 2. Variable Lifetime — When Does It Live and Die?
Even within the same scope, variables can have different lifetimes
— i.e., how long they stay alive in memory.
Let’s see the types of storage classes that decide a variable’s lifespan.
⚙️ 3. The Four Storage Classes in C
| Storage Class | Keyword | Lifetime | Scope | Default Value | Memory Location |
|---|---|---|---|---|---|
| Automatic | auto |
Till function ends | Local | Garbage | Stack |
| External | extern |
Entire program | Global | 0 | Data segment |
| Static | static |
Till program ends | Local/Global | 0 | Data segment |
| Register | register |
Till function ends | Local | Garbage | CPU register (if available) |
Let’s understand them one by one.
🔹 3.1 auto — The Default Local Variable
Every local variable you declare is automatically auto unless you specify otherwise.#include <stdio.h>
void demo() { auto int x = 5; printf("x = %d\n", x);}
int main() { demo(); return 0;}
You can skip writing auto because it’s the default.
x dies as soon as the function ends.
🔹 3.2 register — For Speed Demons
When you declare a variable as register, you request the compiler to keep it in the CPU register for faster access.
#include <stdio.h>
int main() { register int i; for(i = 1; i <= 5; i++) printf("%d ", i); return 0;}
Output:
1 2 3 4 5
Note: You can’t take the address of a register variable using &, since it may not have a regular memory location
🔹 3.3 static — The Memory Keeper
Static variables retain their value between function
calls.
They’re local in scope but global in lifetime!
#include <stdio.h>
void counterFunc() { static int count = 0; // Initialized only once count++; printf("Count = %d\n", count);}
int main() { counterFunc(); counterFunc(); counterFunc(); return 0;}
Output:
Count = 1
Count = 2
Count = 3
Even though count is local, it remembers its last value
between calls — like a goldfish that actually remembers things 🐠.
🔹 3.4 extern — The Variable Borrower
extern allows you to use a global variable defined in
another file or section of code.
File 1: file1.c
int num = 10;
File 2: file2.c
#include <stdio.h>
extern int num; // Declare but not defineint main() { printf("%d\n", num); return 0;}
Output:
10
🧩 4. Variable Shadowing — When Local Hides Global
If a local variable has the same name as a global one, the local
variable shadows the global one within its block.
Example:
#include <stdio.h>
int value = 100; // Global variable
int main() { int value = 10; // Local shadows global printf("Local value = %d\n", value); printf("Global value = %d\n", ::value); // ❌ Not valid in C (unlike C++) return 0;}
In C, you can’t directly access the hidden global variable —
it’s simply masked inside that function.
💡 Key Takeaways
- Scope
decides where a variable can be used.
- Lifetime
decides how long it exists in memory.
- auto
and register are short-lived; static and extern can live across the entire
program.
- Global
variables offer visibility but reduce safety.
- Static
variables remember — but never forget!
🧪 Lab Challenges
Challenge 1:
Write a function visitCounter() that prints the number of times it has been
called using a static variable.
Challenge 2:
Create a global variable sum and modify it from two different functions using
extern.
Challenge 3:
Experiment with declaring a local and global variable of the same name. Observe
which one the program uses.
Challenge 4 (Think Deep):
Why do you think C makes local variables short-lived? What could go wrong if
everything were global?
🌱 Coming Up Next (Post 4 Preview)
“Functions and Recursion — When Functions Call Themselves!”
We’ll learn how functions can act like mirrors, solving problems like
factorial, Fibonacci, and number reversal by calling themselves.
Post a Comment