1

在这里,我们再次成为互联网的好人。

这是我正在使用的代码:

//This is what is in the header file
int *myArr[]; // A two-dimensional array representing holding the matrix data

//This is what is in the definition file
Matrix::Matrix(int n, int m)
{
    myRows = n;
    myColumns = m;
    initialize();
}

void Matrix::initialize()
{
    *myArr = new int[myRows];

    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy
    {
        myArr[i] = new int[myColumns];
    }
}

出于某种原因,当我使用 myRows 变量创建 myArr 数组时,它似乎停止引用它之前指向的值。

例如,我给它赋值 3,在执行 *myArr = new int[myRows] 之后,它会将 myRows 的值更改为 9834496,我不明白。

“新”是否取消引用变量或其他内容?还是我做错了什么?

哦,因为这是一个学校练习项目(所以如果你不回答,我不会怪你)我更喜欢答案而不是工作代码,这样我就可以知道我在未来的项目中做错了什么。

4

4 回答 4

2

您应该使用 std::vector<>。它处理内存分配和释放的所有问题。而且它没有任何错误。

然后你将注意力集中在算法的真正目标上。不在内存管理上:-)

typedef std::vector<int> Ints;
typedef std::vector<Ints> Matrix;
Matrix myArray;
于 2011-01-14T16:07:55.603 回答
2

尝试更换:

*myArr = new int[myRows];

经过

myArr = new int*[myRows];
于 2011-01-14T16:08:59.363 回答
2
int *myArr[];

这是错误的!您还必须告诉编译器指针数组的大小。如果你声明如何int a[]。您告诉编译器创建一个大小未知的 int 数组,这在 C++ 中是不允许的。这就是为什么你不能这样做。

我建议你这样做:

int **myArr;

void Matrix::initialize()
{
    myArr = new int*[myRows]; //note int* here!

    for (int i=0; i < myRows; i++)
    {
        myArr[i] = new int[myColumns];
    }
}

现在应该可以了。

于 2011-01-14T16:06:26.633 回答
0

我不确定您的项目是否需要使用多级指针,如果不是,您可以解决此问题的另一种方法是将多维数组视为一个大平面数组。

这意味着当您到达一行的末尾时,之后的索引将是下一行的第一个元素。以下是代码的外观:

// In this approach the double pointer int**
// is replaced with just a simple int*
int *myArr;

// Here's your Matrix ctor. Note the use of the initializer list
Matrix::Matrix(int n, int m) : myRows(n), myColumns(m)
{
    initialize();
}

void Matrix::initialize()
{
    myArr = new int[myRows * myColumns];

    /* This loop is no longer needed since we're allocating 
       one big chunk at once.
    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy
    {
      myArr[i] = new int[myColumns];
    }
    */
}

// To retrieve stuff from your array
// you would do something like this:
int Matrix::operator() (const int x, const int y)
{
  return myArr[x * myRows + y];
}
于 2011-01-17T07:54:49.897 回答