Я продолжаю получать сообщение об ошибке, код 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);}
Спасибо вам за помощь. Я действительно борюсь здесь …
Не уверен, как вы начали с кодом. Код может быть немного упрощен, чтобы помочь вам и читателям вашего кода понять, что происходит.
функция 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
, что имеет смысл сейчас, так как вы обращаетесь к памяти, которая находится за пределами.
Поскольку я не знаю, что вы пытаетесь вычислить в этом выражении, мне трудно предложить что-то полезное. Я надеюсь, что у вас достаточно, чтобы взять его отсюда.