2

这个程序必须有一个函数可以接受 2 个数组并在第三个数组中返回它们的乘积。所有数组都必须是 2d 的,并且一个单独的函数必须按成员完成元素的乘法。当我在 Visual Studio 中运行它时,我得到了错误:

Unhandled exception at 0x003f15ec in program4.exe: 0xC0000005:  
Access violation reading location 0x00000000.

这可能是由于我对 C++ 缺乏了解,但我认为我可能犯了语法错误或其他问题。这是程序:

#include<iostream>
using namespace std;

void ProductArrays(int[3][4], int[3][4], int** array3[3][4]);


void main()
{
int array1[3][4] = { {1,3,5,7}, {9,11,13,15},  {17,19,21,23} };
int array2[3][4] = { {2,4,6,8}, {10,12,14,16}, {18,20,22,24} };
int** array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0};

ProductArrays(array1, array2, array3);

system("pause");
return;
}

void ProductArrays(int array1[3][4], int array2[3][4], int** array3[3][4])
{
int i,j;
for (i=0;i<3;i++)
    {
    for(j=0;j<4;j++)
        {
          **array3[i][j] = array1[i][j] * array2[i][j];
        }
    }
return;
}
4

2 回答 2

2

我认为你的意思array3是引用一个二维指针数组,但它实际上是一个二维数组int**。所以当你做乘法时,这部分:

**array3[i][j]

试图取消引用 中的内容array3[i][j],即 0,因此是 AccessViolation。我想你可能的意思是签名是:

void ProductArrays(int array1[3][4], int array2[3][4], int (&array3)[3][4])

并声明array3 与array1 和array2 的类型相同。

于 2013-04-06T20:18:41.850 回答
1

(1)
array3 的声明是错误的,因为你需要。

int** array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0};

你需要这个如果我正确理解你的问题:

int array3[3][4] = {0,0,0,0,0,0,0,0,0,0,0,0};

(3)
您收到错误,因为您正在创建指向 NULL ( 0) 的指针的二维数组,并且您正在分配0位置。

**array3[i][j] = array1[i][j] * array2[i][j];
               ^ assign to `0` location 

(2)
声明你的功能如下:

void ProductArrays(int array1[3][4], int array2[3][4], int (*array3)[4])
{ //                                                          ^ notice
int i,j;
for (i=0;i<3;i++)
    {
    for(j=0;j<4;j++)
        {
           array3[i][j] = array1[i][j] * array2[i][j];
        // ^ remove **  
        }
    }
return;
}

从 main 中调用它,例如:

ProductArrays(array1, array2, array3);

另外一点,我的答案是通过地址传递,@Barry 的答案是通过引用传递。在 C++ 中,两者都是允许的。(在 C 中只能通过地址传递

通过具有指针功能的引用传递,但像值变量一样易于使用所以@Barry 的答案更好。考虑我的回答以了解观点。

于 2013-04-06T20:18:01.093 回答