указатели — Нарушение памяти в переполнении стека

Я получаю следующую ошибку при запуске моего кода:

Необработанное исключение в 0x00F66754 в KSU.CIS308.Project5.exe: 0xC0000005: Место записи нарушения прав доступа 0xFDFDFDFD.

Я предполагаю, что это связано с наличием памяти для указателя, но не тем, на что он указывает. Я понятия не имею, как назначить это все же. Вот код, это метод конструктора для объектов Matrix:

Matrix::Matrix(int row, int col)
{
this->rows = row;
this->cols = col;
this->arr = new int*[row];
for (int i = 0; i < row; i++)
{
this->arr[i] = new int[col];
}
}

this->arr = new int*[row]; это то, что бросает это. Это указатель на указатель, так что я могу хранить матрицу как двумерный массив. Буду признателен за любую оказанную помощь.
Я думаю, что это также бросается позже, но если я могу понять один, остальное должно быть легко исправить также.

Arr объявлен так в заголовочном файле:

int **arr;

Итак, при отладке я обнаружил, что col получает 0, что может объяснить ошибку.
Я думал, что рассчитал правильное значение для его передачи. Вот основной файл. Я использую strtok’s, чтобы поместить все в вектор. Формат ввода пользователя: «1 2 3 // 3 2 1» Где «//» — разрыв строки.

int main() {
vector<int> v1;
int rowCountA = 1;
int colCountA = 0;
cout << "Enter First Matrix (put // to denote row breaks): ";
char buff[200];
char *token;
char *tok;
scanf("%s", buff);
token = strtok(buff, "//");
while (token != NULL)
{
tok = strtok(token, " ");
while (tok != NULL)
{
v1.push_back(atoi(tok));
tok = strtok(NULL, " ");
colCountA++;
}

token = strtok(NULL, "//");
rowCountA++;
}A = new Matrix(rowCountA, colCountA/(rowCountA+1));

for (int i = rowCountA; i > 0; i--)
{
for (int k = colCountA; k < 1; k--)
{
A->setElem(i, k, v1.back());
v1.pop_back();
}
}
}

-1

Решение

Как вы узнали, проблема заключается в передаче 0 в качестве одного из измерений, в противном случае создание 2D-массива является правильным. Вы никогда не должны позволять col равным 0, в худшем случае (скажем, пустой ввод), сделайте его равным 1.

В любом случае вы неправильно анализируете ввод:

scanf("%s") возвращает только первое число, потому что это останавливается на первом месте. Ваш код должен использовать fgets() вместо.

Используя строковые функции C, вы должны заменить scanf("%s", buff); с:

fgets(buff, sizeof(buff)/sizeof(char), stdin);

Но вы не можете гнездо звонки в strtok(), Когда вы разбили строку на // а затем позвоните strtok на каждом токене вы больше не можете получить следующий строка потому что он забывает о токенизации на основе //,

Вот грубый эквивалент синтаксического анализа, который вы делаете с использованием ввода-вывода C ++ (хотя код делает есть другие ошибки):

string sbuff;
getline(cin, sbuff);
stringstream ss(sbuff); // header file <sstream>
while (ss >> sbuff) {
if (sbuff == "//") {
rowCountA++;
}
v1.push_back(atoi(sbuff.c_str()));
colCountA++;
}
0

Другие решения


По вопросам рекламы [email protected]