2013-03-20 2 views
2

МеждуРазница между двумя различными инициализации массива в C

int array[100][100]; 

И

int array[100][100]={0}; 

В первом из них, когда я напечатать все элементы массива, то после того, как 94-й строке, на полпути через него , Я начинаю получать значения мусора, но все значения до этого равны 0, тогда как для второго значения все значения равны 0.

Не инициализируется первое объявление с использованием по умолчанию 0 значение, и если это не так, howcome не все значения в массиве являются мусором, и почему только после 94-й строки появляются значения мусора?

+2

«Почему только некоторые являются мусором» => * Все * из них - мусор. Это просто, что некоторые из мусора * происходят *, чтобы выглядеть так, как будто это не так. – Jon

+0

** Хорошее чтение: [C и C++: частичная инициализация автоматической структуры] (http://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure) ** –

ответ

1

Не инициализируется ли первое объявление с использованием значения по умолчанию 0?

Нет. Предполагая, что это переменная с локальным охватом, ваше первое объявление не приводит к какой-либо инициализации вообще.

Как далеко не все значения в массиве являются мусором, и почему только после 94-й строки появляются значения мусора?

Неинициализированная память может иметь любое значение, включая значения 0, которые вы наблюдаете.

1

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

1

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

Тот факт, у вас есть четкое памяти до 94-й элемент не потому, что операционная система дала вам некоторые чистый/еще неиспользованные памяти.

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

1

Там нет явной инициализации в первом сообщении. Неявная инициализация возможна, если массив объявлен в глобальной области.

Причина, по которой «кажется, что она наполовину инициализирована», заключается в том, что программа пространства пользователя обычно начинается с обнуленного стека/кучи по соображениям безопасности (без доступа к данным из других процессов, содержащих пароли и т. Д.), Но нет никакой гарантии, что локальная переменная всегда очищается. Есть скорее гарантия, что это не из-за соображений производительности. Даже в C может произойти большая активность, прежде чем main будет вызван: crt0 инициализирует среду выполнения, копирует статические данные из разделов read_only в глобальные переменные и т. Д. В результате много кучи программ и стек больше не целы.

0

Прежде всего +1 для чистого и прямого вопроса. Теперь для ответа локальные переменные, если они явно не инициализированы, не инициализируются неявно. Все 93 члена, содержащие 0, а не некоторые другие значения мусора, не являются определенным поведением.Вы можете попробовать это, выполнив вышеуказанный фрагмент кода несколько раз, и вы увидите разные значения мусора, возвращающиеся назад для первой декларации. Для лучшего понимания перейдите на уровень сборки вышеуказанного кода и убедитесь сами, что происходит внутри.

1

int array [100] [100];

if this declaration is in the scope of main i.e in Stack Segment then 

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

if same declaration is in Global, then all the array elements will be 

instialized to Zero.

int array [100] [100] = {0};

Irrespective of any segments [Stack/Data(Global,Static)] if any one 

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

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