我一直收到错误消息,我的行
的exc_bad_access代码= 1asize = *(***(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 :(得分: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
,这是有道理的,因为你正在访问超出范围的内存。
由于我不知道你在那个表达中想要计算什么,所以我很难建议一些有用的东西。我希望你有足够的能力从这里开始。