2014-02-03 2 views
0

Я пытаюсь читать имена из файла, который мне дается. Количество имен, которые считываются, основано на пользовательском вводе. Это компилируется отлично, но когда я запускаю его, я получаю эту ошибку:динамическое распределение строковых массивов C++

«0xC0000005: место записи нарушения доступа 0xabababab».

Я провел некоторое исследование, и я думаю, что это, вероятно, потому, что я пишу над границами массива, но я не могу понять, почему это так.

Прежде, чем кто-нибудь спросит, мне сказали, что мне нужно использовать строку * для моего массива. Я не должен использовать векторы или массив символов. Спасибо.

int Capacity; 
    int numNames = 0; // wasn't in original question, but was in the code 
    cin >> Capacity; 

    string name; 
    string* arr = new string[Capacity]; 

    while(!fs.eof() && numRead < Capacity) 
    { 
     getline(fs , names); 
     arr[numRead] = names; // error thrown here 
     arr++; 
     numRead++; 
    } 
+1

Вы делаете 'аранжировка ++' Может также просто изменить свой цикл, чтобы сделать: 'зЬй :: GetLine (фс, обр [numRead ++ ]); 'и избавиться от' имен' и всего остального. Не забудьте вызвать 'delete [] arr', когда закончите с ним. – Brandon

+0

спасибо, что это был. –

+0

также избавиться от '! Fs.eof()', это неправильная проверка. вместо этого завершите цикл, когда 'getline' терпит неудачу. –

ответ

1

Вы не можете увеличить начальный адрес массива (arr ++), делая это, теряя контроль над массивом. Индексация массива действительна только в том случае, если ссылка на массив указывает на первый элемент массива. Поэтому удалите строку кода arr ++, и, поскольку Дэвид сказал, что вы должны инициализировать numRead до нуля, в противном случае некоторые назначенные большие случайные числа также вызовут эту ошибку.

1

Вы не должны указывать обороты arr. Удалите эту строку кода. Вы используете индексирование массива, arr[numRead], для доступа к элементам массива.

Я также не вижу никаких доказательств того, что вы инициализировали numRead до 0 до начала цикла.

0

Используйте вектор Luke! Это было бы так: std :: vector arr; А затем в цикле добавьте имя к вектору: arr.push_back (name);

код вы пишете в C не C++ И пожалуйста, прекрати вниз вопросы голосования

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