未处理的异常..访问冲突写入位置

Unhandled exception... Access violation writing location

本文关键字:位置 访问冲突 异常 未处理      更新时间:2023-10-16

我是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; 
    }
}

确信有一种更好的方法来将矩阵相乘,但我更感兴趣的是知道为什么这段特定的代码不起作用;它看起来非常简单,我看不出错误来自哪里。

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

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; 
    }
}

请注意,每次启动新的j循环时,我都会将sum初始化为 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()中返回一个值。