Каково состояние переменных по умолчанию? - PullRequest
4 голосов
/ 17 июня 2009

Когда программа C запускается и переменные присваиваются ячейкам памяти, говорит ли стандарт C, инициализировано ли это значение?

// global variables
int a;
int b = 0;
static int c;

В приведенном выше коде 'b' будет инициализировано равным 0. Каково начальное значение 'a'? 'C' отличается, так как он статичен для этого модуля?

Ответы [ 5 ]

11 голосов
/ 17 июня 2009

Поскольку вы специально упоминаете глобальные переменные: в случае глобальных переменных, независимо от того, объявлены они static или нет, они будут инициализированы равными 0.

Локальные переменные с другой стороны будут неопределенными (если только они не объявлены static, в этом случае они тоже будут инициализированы равными 0 - спасибо Тайлеру МакГенри). В переводе это означает, что вы не можете полагаться на то, что они содержат какую-то конкретную вещь - они просто будут содержать любой случайный мусор, который уже был в памяти в этом месте, который может отличаться от запуска к запуску.

5 голосов
/ 17 июня 2009

Редактировать: Следующее относится только к локальным переменным, а не к глобальным.

Начальное значение переменной не определено. В некоторых языках местоположение переменной в памяти обнуляется при объявлении, но в C (и C ++) неинициализированная переменная будет содержать любой мусор, который живет в этом месте в то время.

Так что лучший способ думать об этом - то, что неинициализированная переменная, скорее всего, будет содержать мусор и иметь неопределенное поведение.

4 голосов
/ 17 июня 2009

a будет равно нулю, а c тоже, если они глобальные и явно не инициализированы. Это также верно для локальных статических переменных.

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

См. here для правил инициализации и распределения в C для различных объектов.

1 голос
/ 17 июня 2009

Я слишком медленно печатаю этим утром. Когда я отвечал, быстро вошли три человека, поэтому я удалил большую часть своего поста. Ссылка, которую я нашел, была ясной и краткой, поэтому я все равно публикую это: Википедия по «неинициализированной переменной» для обсуждения основных вопросов.

0 голосов
/ 17 июня 2009

Быстрый тест показывает, что 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. Для статически хранимых переменных это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...