Инициализация нестатических переменных - PullRequest
2 голосов
/ 05 января 2012

Я читаю книгу C часто задаваемых вопросов. Вот отрывок из книги

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

Вот мой код:

#include <stdio.h>
int main (int argc, const char * argv[])
{    
    {
        int x;
        printf("%d", x);
    }
}

Результат printf равен 0. Почему инициализируется переменная?

Ответы [ 7 ]

5 голосов
/ 05 января 2012

Для статических и глобальных переменных это 0; автоматические переменные не инициализируются по умолчанию.

в языке c нет значения по умолчанию для нестатических локальных переменных. Переменная содержит то, что было в памяти, прежде чем она стала переменной. Лучше всегда инициализировать нестатическую локальную переменную перед использованием ее на языке c (или, по крайней мере, перед сравнением с чем-то другим). Кроме того, лучше всего предположить, что значения по умолчанию не существует, поскольку оно варьируется от языка к языку, а также от аппаратного обеспечения до аппаратного.

Подробнее: http://wiki.answers.com/Q/What_is_the_default_value_of_integer_in_c#ixzz1iaij7hRK

4 голосов
/ 05 января 2012

Не инициализировано. Ячейка памяти, занимаемая вашим x, по-прежнему имеет значение от предыдущего использования. Однако значение x может быть любым, поэтому на него нельзя положиться.

1 голос
/ 05 января 2012

Начальное значение переменной automatic, если она не инициализирована явно, является неопределенным.

Неопределенное значение означает либо неопределенное (может быть 0, либо 42), либо представление прерывания.Ловушка означает чтение неинициализированной переменной с неопределенным поведением (например, сбой в вашей программе).

1 голос
/ 05 января 2012

Некоторые компиляторы выполнят инициализацию по умолчанию для вас, некоторые - нет.Вы не должны рассчитывать на них.Строка с надписью

int x;

должна сказать

int x = 0;

, если вы этого хотите.Для некоторых компиляторов C возможно, что x равно -23157263 в точке, где вызывается printf.

1 голос
/ 05 января 2012

Undefined означает, что это может быть что угодно, даже 0. Другая реализация может иметь другое или случайное значение. Нет никакого способа узнать, и вы не можете поверить, что это будет одинаковым при каждом исполнении.

0 голосов
/ 05 января 2012

Я вспоминаю, что Visual Studio (и, возможно, по-прежнему делает) устанавливает автоматические переменные в 0 или ноль в некоторых случаях, когда код был скомпилирован с флагами отладки. Как уже говорили другие, вы не должны рассчитывать ни на какие значения по умолчанию.

0 голосов
/ 05 января 2012

Потому что в области памяти, где находится x, уже есть 0, но это просто «удача», в этом месте может быть любое число или символ.Поэтому, чтобы быть уверенным, что результат всегда будет одинаковым, вы всегда должны инициализировать переменную.

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