Каково состояние переменных по умолчанию?
-
06-07-2019 - |
Вопрос
Когда программа C запускается и переменные присваиваются ячейкам памяти, говорит ли стандарт C, инициализировано ли это значение?
// global variables
int a;
int b = 0;
static int c;
В приведенном выше коде 'b' будет инициализировано равным 0. Каково начальное значение 'a'? Отличается ли 'c', поскольку он статичен для этого модуля?
Решение
Поскольку вы специально упоминаете глобальные переменные: в случае глобальных переменных, независимо от того, объявлены они статические
или нет, они будут инициализированы равными 0.
локальные переменные будут неопределенными (если только они не объявлены static
, и в этом случае они тоже будут инициализированы равными 0 - спасибо, Тайлер МакГенри). В переводе это означает, что вы не можете полагаться на то, что они содержат какую-то конкретную вещь - они просто будут содержать любой случайный мусор, который уже был в памяти в этом месте, который может отличаться от запуска к запуску.
Другие советы
Изменить: Следующее относится только к локальным переменным, но не к глобальным.
Начальное значение переменной не определено. В некоторых языках расположение переменной в памяти обнуляется при объявлении, но в C (и C ++) неинициализированная переменная будет содержать любой мусор, который живет в этом месте в то время.
Поэтому лучше всего думать о том, что неинициализированная переменная, скорее всего, будет содержать мусор и иметь неопределенное поведение.
a
будет равно нулю, а также c
, если они глобальные и явно не инициализированы. Это также верно для локальных статических переменных. Р>
Только локальные нестатические переменные не инициализируются. Также память, выделенная с помощью malloc, не инициализируется. Р>
См. здесь
для правил инициализации и размещения в C для разных объектов.
Я слишком медленно печатаю этим утром. Когда я отвечал, быстро вошли три человека, поэтому я удалил большую часть своего поста. Ссылка, которую я нашел, была четкой и краткой, поэтому я все равно публикую ее: Википедия по " неинициализированной переменной " для обсуждения основных вопросов.
Быстрый тест показывает, что a и c равны 0.
int a;
static int c;
int main() {
printf("%d %d\n", a, c);
return 0;
}
Местоположение a (и c) определяется во время компиляции; то есть они не помещаются ни в стек, ни в интервал памяти, возвращаемый функцией malloc. Я думаю, что стандарт C говорит, что они инициализируются на 0 во всех случаях.
Я на 99,9% уверен в отношении c
и на 98% уверен в отношении a
. Ключевое слово static
в контексте глобальных переменных действительно аналогично private
в (скажем) C ++ и Java: оно касается видимости, а не места хранения.
То, что Эндрю Хэйр говорит о неинициализированных переменных, верно для данных, хранящихся в стеке или в памяти malloc'd. Это не так для статически хранимых переменных.