C не являється блок-структурованою мовою на зразок Pascal чи інших мов, оскільки функцію не можна означити всередині іншої функції. З іншого боку, змінні можуть бути описані у блок-структурованому вигляді всередині функції. Оголошення змінних (включаючи ініціалізацію) може слідувати за лівою фігурною дужкою, яка започатковує будь-яке складене твердження, а не тільки починає функцію. Змінні, оголошені таким чином, приховано від однаково названих змінних у зовнішніх блоках і залишаються існувати до відповідної правої фігурної дужки. Наприклад, у
if (n > 0) {
int i; /* оголошення нової i */
for (i = 0; i < n; i++)
...
}
зоною дії змінної i є «істинне» відгалуження if; це не матиме жодного стосунку до жодного i поза межами цього блока. Автоматичну змінну, оголошену та ініційовану у блоці, ініційовано кожний раз при входженні у цей блок.
Автоматичні змінні, включаючи формальні параметри функцій, також приховані від зовнішніх змінних і функцій з тією самою назвою. Маючи оголошення
int x;
int y;
f(double x)
{
double y;
}
змінна x, як параметр функції f типу double, немає нічого спільного з зовнішньою x типу int. Те саме стосується змінної y. Але, загалом, краще уникати назв змінних, що співпадають з назвами з інших зон дії, занадто велика ймовірність плутанини і помилок.