5. Variable Scope and Lifetime
5.1 Local Variables
Variables declared inside a function are local to that function:
- Scope: Only accessible within the function where they're declared
- Lifetime: Created when function is called, destroyed when function returns
- Storage: Usually on the stack
#include <stdio.h>
void function_a() {
int local_var = 10; // Local to function_a
printf("In function_a: %d\n", local_var);
}
void function_b() {
int local_var = 20; // Different variable, local to function_b
printf("In function_b: %d\n", local_var);
}
int main() {
int local_var = 5; // Local to main
printf("In main: %d\n", local_var);
function_a(); // Output: In function_a: 10
function_b(); // Output: In function_b: 20
printf("Back in main: %d\n", local_var); // Still 5
return 0;
}
5.2 Global Variables
Variables declared outside all functions are global:
- Scope: Accessible from any function in the program
- Lifetime: Exist for the entire program execution
- Storage: In static memory area
#include <stdio.h>
// Global variables
int global_counter = 0;
float global_sum = 0.0;
void increment_counter() {
global_counter++; // Can access global variable
printf("Counter: %d\n", global_counter);
}
void add_to_sum(float value) {
global_sum += value; // Can modify global variable
printf("Sum: %.2f\n", global_sum);
}
int main() {
increment_counter(); // Counter: 1
increment_counter(); // Counter: 2
add_to_sum(10.5); // Sum: 10.50
add_to_sum(7.3); // Sum: 17.80
printf("Final values - Counter: %d, Sum: %.2f\n", global_counter, global_sum);
return 0;
}
5.3 Variable Shadowing
When a local variable has the same name as a global variable, the local variable "shadows" the global one:
#include <stdio.h>
int value = 100; // Global variable
void test_shadowing() {
int value = 50; // Local variable shadows the global one
printf("Local value: %d\n", value); // Prints 50
}
int main() {
printf("Global value: %d\n", value); // Prints 100
test_shadowing();
printf("Global value after function: %d\n", value); // Still 100
return 0;
}
5.4 Best Practices for Variable Scope
- Minimize global variables: Use them sparingly
- Prefer local variables: Keep data close to where it's used
- Use meaningful names: Avoid naming conflicts
- Initialize variables: Always initialize before use
// Good practice
int calculate_area(int length, int width) {
int area = length * width; // Local variable, clearly named
return area;
}
// Avoid this
int x, y, z; // Global variables - hard to track
int calc(int a, int b) {
z = a * b; // Modifying global state
return z;
}
No comments to display
No comments to display