Нарушение прав доступа зацикливание и запись - PullRequest
2 голосов
/ 02 июня 2011

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

Это дает мне: Access Violation, но не может дать мне точную линию.Я совсем новичок в c ++ и не очень хорош в обработке исключений. EDIT: Переменные и массивы объявлены в верхней части, но я приведу их.

Ответы [ 4 ]

3 голосов
/ 02 июня 2011

Ваш внешний цикл for равен for(j=1; j<11; j++), что означает, что j будет иметь значения от 1 до 10 (включительно).Но массив определяется как string bord[10][10], поэтому допустимы только индексы от 0 до 9.

Измените цикл на for(j=0; j<10; j++).Вам также необходимо исправить ваш цикл while таким же образом, поскольку он также дает j значения 1,10 вместо 0,9.

2 голосов
/ 02 июня 2011

Размеры на борде неверны. По вашему собственному коду он должен быть string bord[10][11]; вместо string bord[10][10];

Проблемы начинаются с while (j!=11){'. Note how j` доходит до 10 с этим циклом. Это означает, что ваше внутреннее измерение должно быть не менее 11.

0 голосов
/ 02 июня 2011

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

Массив в C ++ представлен непрерывной памятью.Когда вы объявляете массив строк, например: string bord[10], он эффективно выделяет память для 10 строковых объектов.

Что означает bord, так это указатель на эту память.Массив работает с использованием арифметики указателей, то есть при использовании bord [4] это означает bord + 4*sizeof(string), что означает, что перед возвращением указателя есть 4 строковых элемента.Следовательно, bord[4] указывает на 5-й элемент массива.Это объясняет, почему массивы C ++ основаны на 0.

Теперь, когда объявляется массив двух измерений, такой как string bord[10][10], он выделяет массив из 10 элементов, которые являются массивом из 10 строк.Так что bord[1][0] в данном случае означает bord + 1*(sizeof(string[10]))

Если вы перейдете к большему индексу, чем размер вашего массива, вы получите память, которая может не принадлежать вашему массиву (запомните арифметику указателей).Это то, что называется переполнением буфера.

В вашем случае, например, при ссылке на bord[0][10] вы действительно получите значение на bord[1][0], поскольку память после первого массива из 10 строк - это другой массив из 10 строк, но при ссылке на bord[10][0]вы, скорее всего, получите нарушение прав доступа, поскольку эта память не принадлежит массиву.

0 голосов
/ 02 июня 2011

Таким образом, ваше нарушение доступа связано с тем, что вы идете за конец массива, когда вы определяете и массив с 10, у вас есть элементы 0-9. Также см. Мой комментарий выше.

...