2015-10-28 3 views
0

Я объявляю массив динамически, используя новый. Массив состоит из длины строки, которую я даю пользователю. Когда я предоставляю строку длиной между 7-11, массив печатает значение мусора. Почему это происходит?Значение мусора во время печати массива

#include<iostream> 
#include<algorithm> 
#include<cstring> 
#include<string> 
#include<climits> 
#include<vector> 
#include<ctime> 
#include<map> 
using namespace std; 

int main(){ 
    string str; 
    cin>>str; 
    int i,j; 
    int** arr = new int*[str.length()]; 
    for(i = 0; i < str.length(); ++i) 
     arr[i] = new int[str.length()]; 

    for(i=0;i<str.length();i++){ 
     for(j=0;j<str.length();j++){ 
      cout<<arr[i][j]<<" "; 
     } 
     cout<<endl; 
    } 
    return 0; 
} 

Выход для строки "BBABCBCAB" является:

36397056 0 8 0 -1 0 1111573058 1094926915 0 
0 0 4 0 -1 0 1111573058 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 

Почему это происходит? И не для других строк с длиной более 12?

+0

"Печатает мусор". Вы ожидали розы? –

ответ

5

Вы по умолчанию инициализируете все свои int s, которые фактически не присваивают им значение. Чтение из неопределенного значения - неопределенное поведение - иногда вы получаете 0, иногда вы получаете некоторые странные значения. Неопределенное поведение не определено.

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

arr[i] = new int[str.length()](); 
//       ^^ 

Или использовать что-то вроде memset или std::fill или std::fill_n.

+0

Спасибо, я буду использовать memset с этого момента. –

+0

Нет. Я все еще получаю ошибку. Всякий раз, когда я использую cin >> str, отображается ошибка. http://ideone.com/kSIQkA –

+0

@Uchiha_itachi Вы не получаете «ошибки» - вы получаете поведение, которое отличается от того, что вы хотите. Ваша проблема в том, что вы не читали документацию для 'memset'. – Barry

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