2016-12-07 5 views
2

Я пишу функцию, которая должна вызываться несколько раз, где я хочу иметь статический указатель на начало списка. Мне нужна функция, независимо от того, сколько раз она называется, для доступа к одному списку, поэтому у меня есть два вопроса.Статическая переменная в функции, называемой повторно C

  1. Могу ли я правильно, что если я открою static t_line *begin = NULL; где t_line это мой-структуру, я считаю, что это уже будет выделено правильное пространство перед main() называется, как я понимаю static переменные делают, то это даст мне нулевой указатель с правильным выделенным размером.

  2. Как только я укажу этот статический указатель на адрес первого элемента в моем списке, в следующий раз, когда функция вызывается и дойдет до этой строки объявления, не будет ли она просто сбросить ее на NULL, и я потеряю свой указатель?

+0

Это дает вам нулевой указатель, и все. Здесь нет никакого выделения, кроме самой статической переменной, которая выделяется в сегменте bss. – Lundin

+0

"[...] нулевой указатель с правильным выделенным размером" не имеет никакого смысла. Вы получаете указатель, это сама переменная ('begin'), но дальнейшего« выделения »не будет. Указатель на данный тип всегда имеет одинаковый размер, нет ничего, что не могло бы быть «правильным». – unwind

+0

Ты абсолютно прав. Я думал об этом совершенно неправильно. – Khaz

ответ

1

Переменные с памятью static инициализируются только один раз, вы можете идти.

Цитирование C11, глава §6.2.4, курсив мой

Объект, идентификатор объявляется без хранения класса спецификатора _Thread_local, и либо с внешней или внутренней связи или с Storage- класс спецификатор static, имеет статическую продолжительность хранения. Его время жизни - это полное выполнение программы , а ее сохраненное значение инициализируется только один раз, до запуска программы.

Это говорит, о сохранении последнего сохраненного значения, ссылаясь на пункт 2 (снова, мой акцент)

Время жизни объекта является частью выполнения программы, в течение которого хранение гарантированно будет зарезервирован для него. Объект существует, имеет постоянный адрес, 33) и сохраняет его последнее сохраненное значение на протяжении всего срока его службы.34) [....]

и для static переменных, как уже упоминалось выше

ее жизни все выполнение программы

+1

Важен параметр «до запуска программы» _ (это также означает, что инициализатор может быть только константой (-ами) компиляции).Оператор инициализации не выполняется при первом вызове функции, но (как сказано) при запуске программы. –

Смежные вопросы