c ++ ошибка :: EXC_BAD_ACCESS для массивов указателей

Я продолжаю получать сообщение об ошибке, код exc_bad_access = 1 для моей строки

asize = *(***(y) + **(y + 1));

в функции суммирования. Я не совсем понимаю, что делать с этой ошибкой, но я знаю, что это не утечка памяти.
Я пытаюсь получить значения, хранящиеся в массиве указателей y, добавить их и сохранить в переменной asize.

void allocArr (int **&x, int ***&y, int **&q, int ****&z)
{
x = new int *[2];
y = new int **(&*x);
q = &*x;
z = new int ***(&q);
}void putArr(int **&x, int &size1, int &size2)
{
*(x) = *new int* [size1];

*(x + 1) = *new int* [size2];

}

void Input (int **&x, int *&arr, int &size1,int &size2, int a, int b)
{

cout << "Please enter 2 non-negative integer values: "<< endl;

checkVal(size1, a);
checkVal(size2, b);
putArr(x, size1, size2);

arr[0] = size1;
arr[1] = size2;

cout << x[0];
}void summation(int ***&y, int *&arr)
{
int asize = 0;
asize = *(***(y) + **(y + 1));
**y[2] = *new int [asize];

*(arr + 2) = asize;

}

int main()
{
int size1, size2;
int a = 1, b = 2;

int** x;
int*** y;
int** q;
int**** z;

int *arr = new int [2];

allocArr(x, y, q, z);
Input(x, arr, size1, size2, a, b);
summation(y, arr);
display(z);}

Спасибо вам за помощь. Я действительно борюсь здесь …

0

Решение

Не уверен, как вы начали с кодом. Код может быть немного упрощен, чтобы помочь вам и читателям вашего кода понять, что происходит.

функция allocArr

Линии

y = new int **(&*x);
q = &*x;

может быть

y = new int **(x);  // &*x == x
q = x;

функция putArr

У вас есть объявление функции как:

void putArr(int **&x, int &size1, int &size2)

Это может быть изменено на:

void putArr(int **x, int size1, int size2)

без изменения того, как вы используете переменные.

Ваш код в функции кажется странным. Вы имели в виду для x[0] а также x[1] указывать на массив size1 а также size2 intс соответственно? Если бы вы сделали, код был бы:

x[0] = new int[size1];
x[1] = new int[size2];

Если вы не имеете в виду вышесказанное, трудно понять, что вы пытаетесь сделать с вашим кодом.

функция Input

У вас есть объявление функции как:

void Input (int **&x, int *&arr, int &size1,int &size2, int a, int b)

Это может быть изменено на:

void Input (int **x, int *arr, int &size1,int &size2, int a, int b)

без изменения того, как вы используете переменные.

Вы вызываете функцию checkVal, но ваш опубликованный код не имеет этой функции. Не ясно, что делает эта функция. У вас есть линия

cout << "Please enter 2 non-negative integer values: "<< endl;

незадолго до звонков checkVal, Предположительно, checkVal читает входные данные и сохраняет их в size1 в первом звонке и size2 во втором звонке. Не понятно, как второй аргумент checkVal используется.

И тогда у вас есть строка:

cout << x[0];

Не ясно, чего вы хотите добиться от печати int* в cout, Возможно, это было частью вашего кода отладки. Строка ничего не меняет в программе. Просто странно видеть это там.

функция summation

У вас есть объявление функции как:

void summation(int ***&y, int *&arr)

Это может быть изменено на:

void summation(int ***y, int *arr)

без изменения того, как вы используете переменные.

В этой функции у вас есть выражение:

asize = *(***(y) + **(y + 1));

Что вы получаете, когда оцениваете ***(y)?

***(y) = **(*y) = **(x) = *(*x) = *(x[0]) = uninitialized value from the line:

x[0] = new int[size1];

Вы получите непредсказуемое поведение при использовании неинициализированного значения.

Второй член строки, **(y + 1) худший виновник.

Вы выделили память для y как:

y = new int **(&*x);

Это указатель на один объект типа int**, а не массив. y+1 неверный указатель Разыменование (y+1) приводит к неопределенному поведению. В вашем случае вы видите exc_bad_access, что имеет смысл сейчас, так как вы обращаетесь к памяти, которая находится за пределами.

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

0

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


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