Является ли int в Objective-C автоматически инициализированным до 0?

Я читаю книгу под названием «Программирование в Objective-C», шестое издание Стивена Г. Кочана. На странице 144 есть следующее утверждение, которое меня смущает:

Локальные переменные, которые являются базовыми типами данных C, не имеют начального значения по умолчанию, поэтому вы должны установить для них какое-либо значение перед их использованием.

Тем не менее, когда у меня есть следующий код, он все еще работает и отображает 0:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    int number;
    NSLog(@"%i", number);

    return 0;
}

Разве int не является базовым типом данных C?


person user3451821    schedule 01.05.2014    source источник
comment
Тесно связано: Исходное значение массива int в C   -  person jscs    schedule 01.05.2014
comment
Он работает до тех пор, пока вы запускаете свой код внутри отладчика. Отладчик делает волшебство с памятью вашего приложения, инициализируя локальные переменные с 0: flounder.com/debug_release.htm   -  person user2378197    schedule 23.06.2015


Ответы (2)


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

В вашем случае number просто имеет ноль, но может иметь и другое значение.

person Lee Duhem    schedule 01.05.2014
comment
Так в основном это несколько случайно? Я всегда должен инициализировать и не могу рассчитывать на то, что он всегда равен 0? Я где-то читал, что это зависит от того, что находится в ячейке памяти в это конкретное время. - person user3451821; 01.05.2014
comment
@ user3451821 Да и да. - person Lee Duhem; 01.05.2014

Локальные переменные размещаются в стеке. Начальное значение локальной переменной не имеет гарантированного значения. Вместо этого значение локальной переменной полностью зависит от любых случайных значений, оставленных предыдущей функцией, которая использовала эту конкретную область стека.

В случае с функцией main начальные значения локальных переменных могут показаться предсказуемыми, поскольку main — это первая функция, которая запускается и использует эту область стека. Однако компилятор не предпринимает никаких усилий, и спецификация языка не требует гарантировать начальное значение локальных переменных.

Таким образом, всегда явно инициализируйте локальные переменные перед их использованием.

person user3386109    schedule 01.05.2014