一个动态创建二维数组的函数

时间:2016-05-31 20:46:43

标签: c++ arrays pointers 2d

我想在一个单独的函数中创建一个动态二维数组。数组的大小将在运行时确定。

直接传递数组:

simple_for_for(:task)

似乎不起作用

通过指针传递数组

  void foo(int **arr,int width,int height)
        {
        arr=new int*[width];
        for(int i=0;i<height;i++)
        {
        arr[i]=new int[height];
        }
        //fill...
        }
    ...
    int** array;
    foo(array)

似乎无法正常工作

我该怎么做?

3 个答案:

答案 0 :(得分:2)

我认为你的问题&#34;是由忽略operator precedence

引起的

您发布的第二个代码似乎错误地符合:

$storage = "[storage account name]"
$storagePath = "https://$storage.blob.core.windows.net/uploads/myosdisk.vhd"

$diskName = "MyOSDisk"
$label = "MyOSDisk"
Add-AzureDisk -DiskName $diskName -Label $label -MediaLocation $storagePath -OS Windows

应该是

*arr[i]=new int[height];

另外,正如其他人指出的那样,使用原始指针有时可能非常邪恶(就像在你的示例中使用 Pointer to Pointer to Pointer ),原始指针也可能导致内存泄漏悬空指针的一些问题。使用&#34;更实用&#34;比如(*arr)[i]=new int[height]; 或其他一些STL容器。

(注:按术语&#34; STL&#34;,我指的是基于STL的标准库的一部分)

答案 1 :(得分:1)

一般来说,多维数组永远不应该,永远不会这样创建。您应该使用包含在对象中的单个数组,该对象使用operator()函数提供行,列,表等访问。

你也应该永远不会从不使用原始指针(除了奇怪的,情有可原的情况),这就是为什么我使用STL的std::vector类来实现你的代码。

class array_2d {
public:
    array_2d(size_t width, size_t height) :
    width(width),
    height(height),
    _array(width * height)
    {}

    int & operator()(size_t x, size_t y) {
        return _array[y * width + x];
    }

    const int & operator()(size_t x, size_t y) const {
        return _array[y * width + x];
    }

    std::pair<size_t, size_t> get_size() const {
        return std::make_pair<size_t, size_t>(width, height);
    }
private:
    size_t width, height;
    std::vector<int> _array;
};

int main() {
    array_2d my_array(5,5);
    my_array(3,3) = 7;
    std::cout << my_array(3,3) << std::endl;
    return 0;
}

====

7

我没有包含很多东西(如果要将它作为原始指针实现,代码会更加复杂)但是这是编写二维(或更多维度)的更好方法,如果你需要的话)数组。

答案 2 :(得分:1)

我们假设您必须以这种方式创建2d数组(使用int**)。

不是尝试传递指针,而是返回表示2d数组的值。

其次,你的代码有一个错误,当你应该遍历height时,你正在循环width。如果height > width,您的代码将进入未定义的行为。

第三,我不知道你是否认为width是第一维或height是第一维,所以让我们假设你写的是你的意思,即{{ 1}}是第一个维度,width是内部维度。

height

然后你必须编写代码来删除分配的数据:

int **foo(int width, int height)
{
    int **arr = new int*[width];
    for(int i=0; i<width; i++)
       arr[i]=new int[height];
    return arr;
}
//....
int width = 10, height = 10;
int** array = foo(width, height);

现在已经说了上面的内容,并且上面应该有效,找到了一个更优的版本here,其中数据是一个连续的块而不是单独分配的块。这样可以减少需要调用for (int i = 0; i < width; ++i) delete [] array [i]; delete [] array; new[]的次数。