动态数组c ++访问冲突写入位置

时间:2014-11-22 20:32:12

标签: dynamic-arrays

我的代码出了什么问题?我有这样的错误。

mnozenie_macierzy.exe中0x00d21673处的未处理异常:0xC0000005:访问冲突写入位置0xcdcdcdcd。

它创建第一个数组,一半创建第二个数组。该程序乘以数组。 如果不对,我的英语很抱歉。我希望你理解我。

#include <iostream>
#include <time.h>

using namespace std;

void losowa_tablica(int **tab1, int **tab2, int a, int b, int c, int d)
{
    int i, j;
    for(i=0; i<a; i++)
    {
        cout << endl;
        for(j=0; j<b; j++)
        {
            tab1[i][j]=rand();
            cout << "tab1[" << i << "][" << j << "] : \t" << tab1[i][j] << "\t";
        }
    }
    cout << endl;
    for(i=0; i<c; i++)
    {
        cout << endl;
        for(j=0; j<d; j++)
        {
            tab2[i][j]=rand();
            cout << "tab2[" << i << "][" << j << "] : \t" << tab2[i][j] << "\t";
        }
    }
    cout << endl << endl;
}
int **mnozenie(int **tab1, int **tab2, int a, int b, int c, int d)
{
    int g, suma, i, j;
    int **mac=new int*[a];
    for(int i=0; i<d; i++)
        mac[i]=new int[d];
    for(i=0; i<a; i++)
        for(j=0; j<d; j++)
        {
            g=b-1, suma=0;
            do
            {
            suma+=tab1[i][g]*tab2[g][j];
            g--;
            }while(g!=0);
            mac[i][j]=suma;
        }
    return mac;
}

int main()
{
    int a,b,c,d;
    cout << "Podaj liczbe wierszy pierwszej macierzy: " << endl;
    cin >> a;
    cout << "Podaj liczbe kolumn pierwszej macierzy: " << endl;
    cin >> b;
    cout << "Podaj liczbe wierszy drugiej macierzy: " << endl;
    cin >> c;
    cout << "Podaj liczbe kolumn drugiej macierzy: " << endl;
    cin >> d;
    int **tab1=new int*[a];
    for(int i=0; i<b; i++)
        tab1[i]=new int[b];
    int **tab2=new int*[c];
    for(int i=0; i<d; i++)
        tab2[i]=new int[d];
    losowa_tablica(tab1, tab2, a, b, c, d);
    if ( b==c )
    {
        cout << "Mnozenie wykonalne" << endl;
        int **mno=mnozenie(tab1, tab2, a, b, c, d);
    }
    else cout << "Mnozenie niewykonalne" << endl;
    system("pause");
}

1 个答案:

答案 0 :(得分:0)

您的代码会产生未定义的行为:

int **tab1=new int*[a]; // allocating an array of 'a' elements
for(int i=0; i<b; i++)  // if b > a then the next line will eventually yield UB
    tab1[i]=new int[b];

int **tab2=new int*[c]; // allocating an array of 'c' elements
for(int i=0; i<d; i++)  // if d > c then the next line will eventually yield UB
    tab2[i]=new int[d];

int **mac=new int*[a];  // allocating an array of 'a' elements
for(int i=0; i<d; i++)  // if d > a then the next line will eventually yield UB
    mac[i]=new int[d];

实际上,上述代码很可能在某些时候执行内存访问冲突。