classы хранения

В чем разница между переменной, объявленной как auto и static ? В чем разница в распределении памяти в auto и static переменных? Почему мы используем static с массивом указателей и каково его значение?

AUTO (по умолчанию) , Static , Extern & Register – 4 модификатора для переменной в C.


  • АВТО: По умолчанию. Нормальная переменная.

  • STATIC : изменяет время жизни переменной. (сохраняет объем, без изменений).

    Это означает, что во время работы ОС НЕ удаляет переменную из памяти после того, как функция (содержащая переменную выходит) и инициализирует переменную каждый раз, когда вызывается функция.

    Скорее статическая переменная инициализируется ТОЛЬКО при первом запуске функции (содержащей ее). Затем он продолжает находиться в памяти до тех пор, пока программа не завершится. другими словами, STATIC эффективно делает переменную GLOBAL в памяти, но имеет только ЛОКАЛЬНЫЙ доступ.

    Если ваша статика хранится, зависит от того, были ли они инициализированы или нет.

    • 0 инициализированных статических данных поступает в .BSS (Block Started by Symbol),

    • non 0 инициализированных данных поступает в .DATA

    Следует отметить, что, хотя статические переменные всегда находятся в памяти, их можно получить только ТОЛЬКО из локальной области (функция, в которой они определены).

  • EXTERN: используется для сообщения компилятору о том, что определение extern является просто заполнителем, а фактическое определение – в другом месте. Объявление переменной как extern приведет к тому, что ваша программа не резервирует память для переменной в области, которую она объявила. Также часто встречаются прототипы функций, объявленные как extern.

  • REGISTER: сигнализирует компилятору о предпочтительном использовании CPU-register (а не ОЗУ) для хранения этой переменной. Используется для повышения производительности при повторном доступе к переменной (для переменных счетчика ex: loop).

Я предполагаю, что если вы говорите об auto переменных, вы, вероятно, подразумеваете локальные переменные в функции. auto по умолчанию, это означает, что переменная выделяется в стеке, когда функция вызывается и освобождается при возврате функции. static означает, что переменная выделяется при первом вызове функции и остается выделенной для остальной части программы. Это означает:

 int foo() { static int x = 0; return x++; } printf("%d\n", foo()); // Outputs 0 printf("%d\n", foo()); // Outputs 1 printf("%d\n", foo()); // Outputs 2