我想在一个单独的函数中创建一个动态二维数组。数组的大小将在运行时确定。
直接传递数组:
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)
似乎无法正常工作
我该怎么做?
答案 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[]
的次数。