классы хранения - PullRequest
       8

классы хранения

4 голосов
/ 18 апреля 2010

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

Ответы [ 2 ]

5 голосов
/ 18 апреля 2010

AUTO (по умолчанию) , Статический , Extern & Регистр - это 4 модификатора переменной в C.


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

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

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

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

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

    • 0 инициализированные статические данные поступают в .BSS (блок начинается с символа),

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

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

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

  • REGISTER: Сигнализирует компилятору, чтобы предпочтительно использовать регистр CPU (а не RAM) для хранения этой переменной. Используется для повышения производительности при повторном доступе к переменной (например, переменные счетчика цикла).

2 голосов
/ 18 апреля 2010

Полагаю, если вы говорите о 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...