2016-05-31 74 views
0

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

直接传递一个数组:

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) 

似乎并没有工作

通过指针

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) 

犯规传递数组似乎工作,要么

怎么办我这样做?

+1

使用'std :: vector',没什么可说的。 –

+1

请避免使用'std :: vector >'。你需要传递一个三元指针才能工作。 – 101010

+1

如果你打算走这条路线,你可以做一个[稍微优化](http://stackoverflow.com/questions/21943621/how-to-create-a-contiguous-2d-array-in- c/21944048#21944048) – PaulMcKenzie

回答

1

假设您必须以这种方式创建2d阵列(使用int**)。

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

其次,您的代码有一个错误,因为当您应该循环访问width时,您正在循环访问height。如果您的代码是height > width,那么您的代码将会陷入未定义的行为。

第三,我不知道你的意思width是第一个维度或height是第一个维度,让我们假设你写的是你的意思,即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); 

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

for (int i = 0; i < width; ++i) 
    delete [] array [i]; 
delete [] array; 

现在不得不说上面,和上面应该工作,更优化的版本被发现here,其中数据是一个连续的块而不是单独分配的块。这减少了需要调用new[]delete []的次数。

+0

谢谢你的帮助,所有的答案似乎工作,但你的比我想达到的更好(1参数少,效果相同) – AlanKalane

2

我认为您的 “问题” 被忽略造成operator precedence

您发布

二码似乎有与行错误:

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

这应该是

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

另外,正如其他人指出的,与个指针有时可能是相当邪恶的(就像在你的榜样与指针指向指针),原始指针也可能会导致一些问题内存泄漏悬摆指针。使用“更实用”的东西,如std::vector或其他一些STL容器。

(注:术语“STL”,我的意思是基于STL标准库的一部分)

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 

有很多东西我不包括(如果你要实现这是一个原始指针的代码会显著更复杂),但此是编写二维(或更多维度,如果需要的话)数组的一种更优越的方式。