未处理的异常...访问违规写入位置

时间:2012-12-08 23:32:44

标签: c++

我是C ++的新手,我正在尝试编写一个使用双指针将两个数组相乘的程序。到目前为止我的代码是:

        #include <iostream>
    using namespace std;

    //multiplies two matrices A(mxl) and B(lxn) to produce C(mxn)

    int m,l,n;
    int **A, **B, **C;

void main(void)
{

...用户输入m,l,n并像这样分配内存。

int i, j;

//creates a new mxl array   
A= (int**) new int*[m];
for(i=0;i<m;i++)
    {
        A[i]=new int[l];
    }

//creates a lxn array
B = (int**) new int*[l];
for(i=0;i<l;i++)
    {
        B[i]=new int[n];
    }

//creates a mxn array
C = (int**) new int*[m];
for(i=0;i<n;i++)
    {
        C[i]=new int[n];
    }

int sum = 0;
for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
    }
      //cout<sum<<"\t";

到目前为止一切正常。如果我将其更改为cout'sum',则它会以正确的顺序返回数组中所有正确的元素;当我尝试将此值放入数组时,它会返回错误消息。

    C[i][j]=sum; 
    }
}

我确信有一种更好的方法可以将矩阵相乘,但我更有兴趣知道为什么这段特殊代码不起作用;它看起来很简单,我无法看到错误的来源。

1 个答案:

答案 0 :(得分:5)

在您的更新中,您添加了以下代码:

C = (int**) new int*[m];
for(i=0;i<n;i++)
{
    C[i]=new int[n];
}

循环条件不正确。而不是i<n您需要i<m

你的乘法循环如下所示:

for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
    }
    C[i][j]=sum; 
}

赋值C[i][j]位于错误的块中 - [j]数组访问超出范围。

应该是这样的:

for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        sum = 0;
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
        C[i][j]=sum; 
    }
}

请注意,每次启动新的sum循环时,我都会将j初始化为0。这可以纠正代码中的其他错误。

如果您使用最严格的范围声明变量,那将会好很多。像这样:

for(int i=0;i<m;i++)
{
    for(int j=0;j<n;j++)
    {
        int sum = 0;
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
        C[i][j]=sum; 
    }
}

如果您这样做,编译器会拒绝您将作业的原始位置放到C[i][j]

您的main函数应该声明如下:

int main()

您应该从main()返回一个值。