Неинициализированное целое число всегда по умолчанию равно 0 в c? - PullRequest
22 голосов
/ 02 июня 2011

Я читаю исходный код nginx и обнаруживаю, что он не инициализирует многие числовые переменные, включая ngx_int_t ngx_last_process;, здесь ngx_int_t, определенный как long int

#if 0
    ngx_last_process = 0;
#endif

Так вот, @ Игорь Сысоев считает ненужным делать инициализацию?

Но в программе предполагается, что значением по умолчанию является 0:

    for (s = 0; s < ngx_last_process; s++) {
        if (ngx_processes[s].pid == -1) {
            break;
        }
    }

Гарантируется ли, что неинициализированная переменная вообще будет иметь значение 0 в c?

Ответы [ 4 ]

28 голосов
/ 02 июня 2011

Внешние и статические переменные по умолчанию обнуляются, это гарантировано. Автоматически и регистр переменные, которые не имеют явного инициализатора, будут иметь неопределенное значение (либо неопределенное значение, либо представление прерываний).

Из стандарта:

C89

6.5.7:

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

C99

6.2.4, §5:

Для такого объекта, у которого нет типа массива переменной длины, его время жизни увеличивается от входа в блок, с которым он связан, до тех пор, пока выполнение этого блока не закончится в в любом случае. (Ввод закрытого блока или вызов функции приостанавливается, но не заканчивается, выполнение текущего блока.) Если блок вводится рекурсивно, новый экземпляр Объект создается каждый раз. Начальное значение объекта не определено. Если для объекта указана инициализация, она выполняется каждый раз при объявлении достигнуто в исполнении блока; в противном случае значение становится неопределенным каждый время, когда декларация достигнута.

6.7.8, §10:

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

- если он имеет тип указателя, он инициализируется нулевым указателем;

- если он имеет арифметический тип, он инициализируется равным нулю (положительно или без знака);

- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами;

- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.

3.17.2, §1:

неопределенное значение: либо неопределенное значение, либо представление ловушки

3.17.3, §1:

неопределенное значение: действительное значение соответствующего типа, если этот международный стандарт не предъявляет никаких требований, какое значение выбирается в любом случае. ПРИМЕЧАНИЕ Неуказанное значение не может быть представлением прерывания.

4 голосов
/ 02 июня 2011

automatic (локальные) переменные не обязательно равны нулю, могут содержать мусор.

global переменные и static переменные гарантированно равны нулю.

2 голосов
/ 02 июня 2011

Зависит от того, как размещена переменная. Статически размещенные переменные инициализируются нулями, тогда как переменные, расположенные в стеке или с malloc(), не являются.

2 голосов
/ 02 июня 2011

Переменные, объявленные (как int) в область файла , инициализируются равными 0.

Пример

int i;
int main()
{
   int x;
   printf("%d",i); // prints 0
   printf("%d",x); // prints some unspecified value
}

Гарантируется ли, что неинициализированная переменная вообще будет иметь значение 0 в c?

Nopes! Это не относится к переменным, объявленным в области видимости функции.

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