帮助在C ++中声明和使用动态分配的Array

时间:2011-05-11 22:34:25

标签: c++ c visual-studio-2010 visual-c++

我需要声明一个数组数组,因此使用下面的代码来实现它:

int **  maxc = new int *[proc_num];//memory allocated for elements of rows
      for (int i = 0; i < proc_num; i++)
      {
            maxc[i] = new int[n];//memory allocated for  elements of each column.
      }

问题是,上面的代码似乎没有编译。我收到以下编译错误:

A value of type "int *" cannot be assigned to an entity of type "int"

这是完整的代码:

//#include<math.h>
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
/*
Banker's algorithm Implementation
*/
 int main(void)
 {
      int n=0;//number of resources we will  be dealing with 
      int proc_num =0;//Total number of processes to share available resources
      int* a = NULL;  // pointer to an int with initial set to point to nothing
     // int* maxc = NULL;
      int* maxR=NULL;
      int* avail = NULL;
      int* avail_temp = NULL;
      //int** alloc = NULL;
      int* unalloc = NULL;

      std::cout<<endl;
      std::cout <<" What is number of resources to be shared? :";
      cin >> n;
      std::cout<<endl;
      while(std::cin.fail())
      {
            std::cout<< " Error Please provide valid number !" <<endl;
            std::cin.clear() ;
            std::cout<<endl;
            std::cout <<" What is number of resources to be shared? :";
            cin >> n;
            std::cout<<endl;
      }

      maxR = new int[n];  // Allocate n ints and save ptr in maxc -- holds the max resources available.
      //get the maximum number of each Resources/ Ie Total Resources Available
      for(int i =0; i < n; i++)
      {
            int maxcin=0;
            std::cout << i;
            std::cout<< ". How many of resource #";
            std::cout<< i;
            std::cout<< " do you need to share ?"; 
            cin>>maxcin;
            maxR[i] = maxcin;
      }
      //<8,7,5,9>");

      std::cout<<endl;
      std::cout << "How many processes to share available resources?";
      cin>>proc_num;
      std::cout<<endl;

      int **  maxc = new int *[proc_num];//memory allocated for elements of rows
      for (int i = 0; i < proc_num; i++)
      {
            maxc[i] = new int*[n];//memory allocated for  elements of each column.
      }
}

4 个答案:

答案 0 :(得分:2)

您现在获得的错误与之前发布的内容完全不同。在最后的循环中 -

maxc[i] = new int*[n];

应该是 -

maxc[i] = new int[n];

在您之前发布的代码段中,这是正确的。此外,您应该使用new[]释放delete[]获取的资源,否则会占用内存泄漏。

答案 1 :(得分:2)

您遇到的问题出现在您发布的代码的这一部分中:

int **  maxc = new int *[proc_num];
for (int i = 0; i < proc_num; i++)
{
    maxc[i] = new int*[n];
}

在for循环中,你正在分配一个新的int指针数组,但maxc的原始类型是指向指针的类型。在这种情况下,也可以解释为maxc是一个指向指针数组的指针。那当然是在第一个赋值完成的,你从new返回一个指向int*数组的指针。因此,for循环中的语句为每个数组元素分配了错误的类型。数组元素maxc[x]的类型是int指针,这意味着它们必须指向一个或多个int类型的对象,而不是int*类型的元素。但是循环中的new运算符正在尝试分配另一个int指针数组,并返回指向该分配数组的指针,这意味着返回的类型再次为int**,这是不正确的。因此,您应该将循环内部更改为:

maxc[i] = new int[n]; //allocate an array of int's, and return an int pointer

我注意到您发布的第一段代码实际上是这样做的,所以也许您遇到了一个错过的简单拼写错误?

最后,当您删除此内存时,由于每行都是使用new创建的,因此您必须在代表delete数组的每一行上调用int。接下来,您必须在表示int指针数组的列上调用delete,这些指针指向int的数组。因此,释放所有分配的内存将如下所示:

for (int i=0; i < proc_num; i++)
{
    //call delete on each pointer in each column of the array that is pointing to a
    //row array of int's
    delete [] maxc[i];  
}

//call delete on the pointer pointing to the column of 
//the array that contains the original int pointers that were
//pointing to each of the row arrays of int's
delete [] maxc;

答案 2 :(得分:1)

此:

int main() {
    int proc_num = 100;
    int n = 42;
    int **  maxc = new int *[proc_num];//memory allocated for elements of rows
    for (int i = 0; i < proc_num; i++) {
            maxc[i] = new int[n];//memory allocated for  elements of each column.
    }
}

编译对我很好。

答案 3 :(得分:1)

您可能在声明正确方面遇到问题,但您真正的问题是没有使用标准容器为您完成工作。

此代码:

  int **  maxc = new int *[proc_num];//memory allocated for elements of rows
  for (int i = 0; i < proc_num; i++)
  {
        maxc[i] = new int*[n];//memory allocated for  elements of each column.
  }

可以更正为此以使其编译。

  int **  maxc = new int *[proc_num];
  for (int i = 0; i < proc_num; i++)
  {
        maxc[i] = new int[n];
             //     ^^^^ Note no star here.
  }

但它仍然不是很好的代码,因为你没有考虑异常(如果任何分配失败,这段代码就会泄漏)。在使用过程中,如果您的代码生成异常,您将泄漏所有内存。

更好的解决方案是:

std::vector<std::vector<int> >  maxc(proc_num, std::vector<int>(n, 0)); // even initializes all elements to 0

如果你想看中boost multi-dimensional array这可能会给你一些小的性能提升(如果你正在进行矩阵乘法等)。

如果您真的想亲手操作,那么我会开始学习课程和RAII。