指针数组的c ++错误:: EXC_BAD_ACCESS

时间:2014-09-10 03:01:28

标签: c++ arrays pointers runtime-error 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);


}

感谢您的帮助。我真的在这里挣扎......

1 个答案:

答案 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]分别指向size1size2 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,这是有道理的,因为你正在访问超出范围的内存。

由于我不知道你在那个表达中想要计算什么,所以我很难建议一些有用的东西。我希望你有足够的能力从这里开始。