DevAcademia
C++C#CPythonJava
  • C Basics

  • Introduction to C
  • Getting Started with C
  • C Syntax
  • C Output
  • C Comments
  • C Variables
  • C Data Types
  • C Constants
  • C Operators
  • C Booleans
  • C If...Else Statements
  • C Switch Statement
  • C While Loops
  • C For Loops
  • C Break and Continue
  • C Strings
  • C User Input
  • C Memory Address
  • C Pointers
  • C Files
  • C Functions

  • C Functions
  • C Function Parameters
  • C Scope
  • C Function Declaration
  • C Recursion
  • C Math Functions
  • C Structures

  • C Structures
  • C Structs & Pointers
  • C Unions
  • C Enums

  • C Enums
  • C Memory

  • C Allocate Memory
  • C Access Memory
  • C Reallocate Memory
  • C Deallocate Memory
  • C Structs and Memory
  • C Memory Example
  • C Quiz

  • C Quiz
  • C Basics

  • Introduction to C
  • Getting Started with C
  • C Syntax
  • C Output
  • C Comments
  • C Variables
  • C Data Types
  • C Constants
  • C Operators
  • C Booleans
  • C If...Else Statements
  • C Switch Statement
  • C While Loops
  • C For Loops
  • C Break and Continue
  • C Strings
  • C User Input
  • C Memory Address
  • C Pointers
  • C Files
  • C Functions

  • C Functions
  • C Function Parameters
  • C Scope
  • C Function Declaration
  • C Recursion
  • C Math Functions
  • C Structures

  • C Structures
  • C Structs & Pointers
  • C Unions
  • C Enums

  • C Enums
  • C Memory

  • C Allocate Memory
  • C Access Memory
  • C Reallocate Memory
  • C Deallocate Memory
  • C Structs and Memory
  • C Memory Example
  • C Quiz

  • C Quiz

Loading C tutorial…

Loading content
C FunctionsTopic 50 of 64
←PreviousPrevNextNext→

C Scope

Introduction to Scope

Scope in C programming defines the visibility and accessibility of variables, functions, and other identifiers within a program. It determines where in the code an identifier can be accessed and used.

Understanding scope is crucial for writing maintainable, bug-free code because it affects variable lifetime, memory usage, and prevents naming conflicts.

Types of Scope

Scope TypeDescriptionLifetime
Local (Block) ScopeIdentifiers declared inside a function or block ({}). Visible from their point of declaration to the end of that block.Automatic by default: created on block entry, destroyed on block exit
File Scope (Global Identifiers)Identifiers declared outside any block are visible from their declaration to the end of the translation unit (source file).Objects at file scope have static storage duration (exist for entire program execution)
Function ScopeApplies to labels (used with goto) inside a function.Exists within the function
Internal vs External Linkage (at file scope)Linkage controls visibility across translation units: static ⇒ internal (this file only); external (default) ⇒ visible to other files via extern.Does not change lifetime; affects name visibility across files

Local Scope Example

Example
#include <stdio.h>

void testFunction(void) {
    int localVar = 10;
    printf("Inside function: %d\n", localVar);
    {
        int blockVar = 20;
        printf("Inside block: %d\n", blockVar);
    }
    // printf("%d\n", blockVar); // Error: blockVar not accessible here
}

int main(void) {
    testFunction();
    // printf("%d\n", localVar); // Error: localVar not accessible here
    return 0;
}
Output
Inside function: 10
Inside block: 20
ℹ️ Note: Variables declared inside blocks are only accessible within those blocks (and nested blocks) from their point of declaration onward.

Global (File) Scope, Shadowing, and Linkage

⚠️ Warning: Avoid excessive use of globals. Prefer passing values via parameters. Use 'static' at file scope to prevent exporting names you don't intend to share.
Example
#include <stdio.h>

int globalVar = 100;         // file scope, external linkage by default
static int hiddenVar = 7;    // file scope, internal linkage (this file only)

void modifyGlobal(void) {
    globalVar += 50;
    printf("Modified global: %d\n", globalVar);
}

void shadowGlobal(void) {
    int globalVar = 999; // shadows file-scope globalVar within this block
    printf("Local shadows global: %d\n", globalVar);
}

int main(void) {
    printf("Initial global: %d\n", globalVar);
    modifyGlobal();
    shadowGlobal();
    printf("Final global: %d\n", globalVar);
    // hiddenVar is visible here, but not from other source files
    printf("Hidden (static) file-scope var: %d\n", hiddenVar);
    return 0;
}
Output
Initial global: 100
Modified global: 150
Local shadows global: 999
Final global: 150
Hidden (static) file-scope var: 7

Scope vs Storage Duration vs Linkage

ConceptWhat It ControlsCommon Options / Examples
ScopeWhere an identifier is visible in source codeBlock scope (locals), file scope (globals), function scope (labels)
Storage DurationHow long the object exists in memoryAutomatic (block), Static (entire program), Dynamic (malloc/free)
Linkage (for file-scope names)Whether a name refers to the same entity across filesExternal (default), Internal (static), None (block-scope locals)

Block Scope in for-Loops (C99+)

A variable declared in a for loop's initializer has block scope limited to the loop.

Example
#include <stdio.h>

int main(void) {
    for (int i = 0; i < 3; ++i) {
        printf("%d ", i);
    }
    printf("\n");
    // printf("%d\n", i); // Error: i is not in scope here
    return 0;
}
Output
0 1 2

Static Local Variables

Static local variables have block scope but static storage duration: they retain their value between function calls and are only accessible within the function where they are declared.

Example
#include <stdio.h>

void counter(void) {
    static int count = 0; // persists across calls
    count++;
    printf("Count: %d\n", count);
}

int main(void) {
    counter();
    counter();
    counter();
    // printf("%d\n", count); // Error: count not accessible here
    return 0;
}
Output
Count: 1
Count: 2
Count: 3

Best Practices

  • Prefer the smallest possible scope for variables (declare near first use).
  • Be aware that locals can shadow globals—avoid name collisions.
  • Limit exported symbols: use 'static' at file scope for internal helpers.
  • Pass data through parameters instead of using globals.
  • Remember: identifiers are visible only from their point of declaration onward.
Test your knowledge: C Scope
Quiz Configuration
4 of 8 questions
Sequential
Previous allowed
Review enabled
Early close allowed
Estimated time: 5 min
C FunctionsTopic 50 of 64
←PreviousPrevNextNext→