该程序必须具有一个可以接受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;
}
答案 0 :(得分:2)
我认为array3
对于2d指针数组的引用意味着什么,但它实际上是int**
的2d数组。所以当你进行乘法时,这部分:
**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的类型相同。
答案 1 :(得分: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
位置的指针的2D数组。
**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的答案更好。考虑我理解观点的答案。