2013-07-23 2 views
2

Я новичок в C++. В последнее время я придерживался простого кода функций C++. Я буду очень благодарен, если вы сможете указать, в чем именно проблема. Код следующим образом:У меня возникла проблема с инициализацией массива C++

// used to test function of fill 
#include<iostream> 
#include<algorithm> 
using namespace std; 
int main(){ 
    int val = 0; 
    int myarray[8]; 
    //fill(myarray,myarray+2,1); 
    for(;val < 8;++val){ 
     cout << myarray[val]; 
     cout << endl; 
     } 
} 

И он распечатал:

-887974872 
32767 
4196400 
0 
0 
0 
4196000 
0 

вопрос, я думал, что значение по умолчанию для массива без инициализации (в этом случае ее размер 8) будет (0,0,0,0,0,0,0,0) , Но там были какие-то странные цифры. Может ли кто-нибудь сказать мне, что случилось и почему?

+3

Это должно подвести итог, почему они не обнулены: http://chat.stackoverflow.com/transcript/message/10771489#10771489 – chris

+0

локальные переменные не инициализируются по умолчанию – assem

+0

* Я думал, что значение по умолчанию для массива без инициализации (в этом случае его размер равен 8) будет (0,0,0,0,0,0,0,0) *. Что заставило вас предположить это? (Я просто имею в виду, не предполагаю, что позволяет играть безопасно и придерживаться того, что говорит doc) –

ответ

11

элементы ип инициализирован, то есть, они содержат значение мусора.

Если вы хотите, чтобы инициализировать элементы массива в 0, используйте:

int myarray[8] = {}; 
+0

Спасибо большое :) – nicknguyen128

+3

@ nicknguyen128, если вы согласны с его ответом, пожалуйста, нажмите галочку по номеру. Это дает ему небольшой репутационный удар, и он отмечает это как ответ для любого, кто находит ваш вопрос и учится у него. –

+0

Я сделал это. благодаря – nicknguyen128

1

Начальные значения не гарантируется 0.

+0

Я бы добавил, что установка флага DEBUG на некоторых компиляторах MSVC будет включать их библиотеки времени выполнения отладки, которые DO инициализируют значения, но RELEASE библиотеки времени выполнения НЕ инициализируют их. Это может быть источником разочарования, если вы не будете осторожны. –

+1

Я часто хочу, чтобы библиотеки отладки инициализировали случайные числа вместо нулей, чтобы избежать этого –

1

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

int *arr = new int[8](); 
0
int myarray[8]; 

Это простое объявление массива, то есть вы сообщаете компилятору «Эй, я собираюсь использовать целочисленный массив размером 8». Теперь компилятор знает, что он существует, но он не противоречит никаким значениям. Он имеет значения для мусора.

Если вы собираетесь инициализировать массив (автоматически), вам нужно добавить пустую последовательность инициализации.

int myarray[8]={}; //this will do 

Счастливое кодирование!

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