В чем разница между статической структурой и нормальной структурой? - PullRequest
5 голосов
/ 06 марта 2012

У меня есть пример кода здесь.

struct node { 
        int data;
        struct node *link;
    };
    static struct node *first = NULL;

Было бы замечательно, если бы кто-нибудь пролил свет на мои вопросы об использовании слова static.

  1. Что делает ключевое слово static в приведенном выше коде?

  2. В чем разница между нормальной структурой и статической структурой?

Ответы [ 5 ]

7 голосов
/ 06 марта 2012

Создает статический указатель на node и инициализирует его NULL.

Определение переменной может иметь несколько значений:

static struct node *first = NULL;

Если определено вне метода, это дает first внутреннюю связь .Его можно использовать только внутри определяющего модуля.

Но вы также можете найти эту строку внутри метода:

void foo()
{ 
    static struct node *first = NULL;
}

Переменная - это переменная в методе, находящаяся в статическом хранилище.Он инициализируется NULL один раз, и все последующие изменения сохраняются между вызовами функции.

5 голосов
/ 06 марта 2012

Это означает, что эту переменную нельзя использовать за пределами этого модуля.

Например, вы не можете ссылаться на этот указатель из другого файла, используя

extern struct node *first;

Важное замечание: структуране статично, только first, который является указателем на такую ​​структуру, является статическим.

2 голосов
/ 06 марта 2012

Это не влияет на определение самой структуры.Это просто означает, что конкретный экземпляр структуры, названный здесь first, имеет внутреннюю связь.

0 голосов
/ 06 марта 2012

При изменении переменной ключевое слово static указывает, что переменная имеет статическую длительность (она выделяется при запуске программы и освобождается при ее завершении), и инициализирует ее значением 0, если не указано другое значение. При изменении переменной или функции в области видимости файла ключевое слово static указывает, что переменная или функция имеет внутреннюю связь (ее имя не видно снаружи файла, в котором она объявлена).

Переменная, объявленная как статическая в функции, сохраняет свое состояние между вызовами этой функции.

При изменении члена данных в объявлении класса ключевое слово static указывает, что одна копия члена является общей для всех экземпляров класса. При изменении функции-члена в объявлении класса ключевое слово static указывает, что функция обращается только к статическим членам.

Статические данные-члены классов должны быть инициализированы в области видимости файла.

В рекурсивном коде статический объект или переменная гарантированно имеют одинаковое состояние в разных экземплярах блока кода.

Члены объединения не могут быть объявлены как статические. Анонимный союз, объявленный глобально, должен быть явно объявлен как статический.

Объекты и переменные, определенные вне всех блоков, имеют статическое время жизни и внешнюю связь по умолчанию. Глобальный объект или переменная, которая явно объявлена ​​как статическая, имеет внутреннюю связь.

0 голосов
/ 06 марта 2012

Статическое ключевое слово для глобальной переменной делает переменную локальной для модуля, в котором она определена. То есть вы не можете получить к нему доступ из другого модуля.

Если статическая переменная определена внутри функции, она поддерживает переменную в актуальном состоянии и обновляется между вызовами этой функции.

...