【问题标题】:Modifying the values of a 2d array of reference in a function在函数中修改二维引用数组的值
【发布时间】:2013-03-29 03:27:47
【问题描述】:

这个程序必须有一个函数可以接受 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;
}

【问题讨论】:

  • void main() 是非标准的。使用int main()return 0; 或完全不使用它。一个好的编译器不应该接受void main()

标签: c++ function multidimensional-array


【解决方案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 的答案更好。考虑我的回答以了解观点。

【讨论】:

  • 注意int (*array3)[4]int array3[3][4]等价于函数参数。
  • @JesseGood 是的 int array3[3][4])int (*array3)[4] 在函数参数中是相同的。参数参数让我感到困惑:) ..谢谢。
  • 谢谢,您的回答帮助我通过地址和参考更好地理解。
  • @Radd 很高兴它对您有所帮助。我建议您阅读 Jesses Good 对我的回答的评论。注意:declaration in function Parliaments are bit different then simple declaration 也请阅读划线答案。
【解决方案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的类型相同。

【讨论】:

  • int (&amp;)[3][4],将array3声明为int array3[3][4],并通过array3传递。
  • int&amp; array3[3][4] 是一个引用数组(这是不允许的)。我想你的意思是int (&amp;array3)[3][4]
猜你喜欢
  • 2011-07-13
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2019-03-18
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多