2013-10-07 3 views
2

я пишу следующий код и установить контрольную точку в Xcode:Почему мой пустой массив не пуст?

#include <iostream> 
using namespace std; 
int main(int argc, const char * argv[]) 
{ 
    int array[12]; 
    return 0;  //Set breakpoint here 
} 

enter image description here

Панель отладчик показывает первые 6 элементов содержат не ноль int с. Почему это?

+0

Массив никогда не пуст. Что вы хотите спросить, почему вы получаете ненулевые значения в нем. – juanchopanza

ответ

8
int array[12]; 

Объявляет массив с 12 элементами, а не пустой массив.

Кроме того, он объявляет их без инициализатора, которые (в области функций) означают, что они будут инициализированы по умолчанию. Для int это означает, что инициализация не выполняется, и итоговые значения int s будут иметь неопределенные значения. Это поведение определено в спецификации для C++.

Если вы хотите обнулить инициализировать массив, то вы должны дать ему инициализатор:

int array[12] = {}; 

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

+0

Верно ли это: «Кроме того, он объявляет их без инициализатора, который (в области функций) означает, что они будут инициализированы по умолчанию». ? –

+1

@ DieterLücking Yep; См. 8.5/11 в спецификации. 8.5 также определяет инициализацию по умолчанию, инициализацию значения, инициализацию нуля и т. Д. – bames53

+1

Просто для завершения ответа для C, так как есть и тег C. В C '{}' не является допустимым инициализатором. Вы должны использовать '{0}', там. –

0

Компилятор C++ не инициализирует переменные, если вы не сообщите об этом.

+0

Это зависит от типов переменных и контекста. – juanchopanza

+0

Значение, если вы создаете массив объектов с нулевыми конструкторами, они построены? Да, это тот способ, которым вы можете сказать компилятору инициализировать переменные. –

0

Потому что ваш массив не инициализирован. На панели «Отладчик» отображается предыдущее значение, хранящееся в этих местах.

2

Потому что вы только объявили массив, а не инициализирован.

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

+0

Это не * объявление *, но определение *, объявление не резервирует память, оно сообщает компилятору, что память будет зарезервирована где-то в другом месте. –

1

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

int array[12] = {0}; 

Проверить эту ссылку для получения более подробной информации: How to initialize array to 0 in C?

Смежные вопросы