【问题标题】:Unhandled exception... Access violation writing location未处理的异常...访问冲突写入位置
【发布时间】:2012-12-08 23:32:44
【问题描述】:

我是 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 分配内存时出错。请仔细检查创建 C 时的尺寸是否正确。
  • 您能否编辑您的答案以显示BC 的分配?由于这是数组乘法,Am*lBl*nC 必须是 m*n
  • 假设最后两段代码在你的程序中是一个单独的块,这里只拆分,可能是因为j超出了范围。
  • C数组分配完毕

标签: c++


【解决方案1】:

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

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

循环条件不正确。你需要i&lt;m,而不是i&lt;n

你的乘法循环如下所示:

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()返回一个值。

【讨论】:

  • 我已将代码更改为该代码,它返回相同的错误消息。
  • 您没有显示分配 BC 的代码,因此请检查您是否分别正确分配了 l×n 和 m×n 矩阵。
  • 是的,您错误地分配了C。我想我们现在已经解决了所有的错误。
  • int main() 是 c++ 中唯一不需要返回语句的函数。
  • @MatthewParker 感谢您的接受,您的第一个问题做得很好。您对提供更多信息的请求做出了很好的回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2013-01-23
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多