Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态创建二维阵列_C++_Visual Studio 2010_Multidimensional Array - Fatal编程技术网

C++ 动态创建二维阵列

C++ 动态创建二维阵列,c++,visual-studio-2010,multidimensional-array,C++,Visual Studio 2010,Multidimensional Array,在这种情况下,我有一个函数接收光线的行数和列数,我希望在函数中动态创建它 #include <stdlib.h> int **array; array = malloc(nrows * sizeof(int *)); if(array == NULL) { fprintf(stderr, "out of memory\n"); exit or return } for(i = 0; i < nrows; i++) { array

在这种情况下,我有一个函数接收光线的行数和列数,我希望在函数中动态创建它

#include <stdlib.h>

int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
    {
    fprintf(stderr, "out of memory\n");
    exit or return
    }
for(i = 0; i < nrows; i++)
    {
    array[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
        {
        fprintf(stderr, "out of memory\n");
        exit or return
        }
    }
#包括
整数**数组;
数组=malloc(nrows*sizeof(int*);
if(数组==NULL)
{
fprintf(stderr,“内存不足”);
退出或返回
}
对于(i=0;i
这不起作用,因为在VS2011中,它说 数组=malloc(n*sizeof(int*); 不能将void*指定给int*
我如何解决这个问题?

< P> VisualC++是一个C++编译器,C++需要你明确地画出代码>空洞*//>代码,不像C,它允许隐式地写<代码> Value*/Cuth.S.< 试一试

但是,在C中就是这样做的,如果以后决定将数据从
int
s更改为某种对象,则不会调用对象的构造函数,因为您使用了
malloc
。如果您想用更适合所有数据类型的C++-ish方式来执行此操作,您可以使用
new

int** array = new int*[nrows];

for (int i = 0; i < nrows; ++i)
    array[i] = new int[ncolumns];
int**array=newint*[nrows];
对于(int i=0;i
这样还可以避免使用
n*sizeof(type)
计算对象的大小

但是如果您选择使用
malloc
分配内存块,您必须使用
free
解除分配它;相反,如果选择使用
new
来分配内存块,则需要使用
delete
来删除它(记住在数组上使用
delete[]
,在非数组上使用纯
delete
)。在
malloc
'd内存块上使用
delete
,或在
new
'd内存块上使用
free
,会导致未定义的行为。原因是
malloc
在堆上分配内存,而
new
在空闲存储上分配内存。它们可能恰好是同一件事;事实上,
new
delete
的一些实现在后台使用
malloc
free
,但这取决于编译器,所以永远不要这样做


注意,在同一个程序中,可以使用<代码> Malc C/代码>和免费>代码,但不推荐使用哪一个,因为它可以分配给特定的内存块,并使用错误的Delphi函数。C++ VisualC++是C++编译器,C++要求您明确地显示代码>空隙*//C>与C不同,C允许隐式转换

void*
s

试一试

但是,在C中就是这样做的,如果以后决定将数据从
int
s更改为某种对象,则不会调用对象的构造函数,因为您使用了
malloc
。如果您想用更适合所有数据类型的C++-ish方式来执行此操作,您可以使用
new

int** array = new int*[nrows];

for (int i = 0; i < nrows; ++i)
    array[i] = new int[ncolumns];
int**array=newint*[nrows];
对于(int i=0;i
这样还可以避免使用
n*sizeof(type)
计算对象的大小

但是如果您选择使用
malloc
分配内存块,您必须使用
free
解除分配它;相反,如果选择使用
new
来分配内存块,则需要使用
delete
来删除它(记住在数组上使用
delete[]
,在非数组上使用纯
delete
)。在
malloc
'd内存块上使用
delete
,或在
new
'd内存块上使用
free
,会导致未定义的行为。原因是
malloc
在堆上分配内存,而
new
在空闲存储上分配内存。它们可能恰好是同一件事;事实上,
new
delete
的一些实现在后台使用
malloc
free
,但这取决于编译器,所以永远不要这样做


请注意,您可以在同一程序中使用
malloc
free
,但不建议这样做,因为您可能很容易忘记是哪一个分配了特定内存块,并对其使用了错误的释放功能。

。。。或者std::vector-在让学生使用计算器之前必须教他们长除法:)@Seth:+1:)你可能想提到将malloc/new与free/delete耦合。@Fredwolf,Seth:许多学生在毕业到更高级别的语言之前都学过机器/汇编。他们可能没有建造计算器,但他们至少学会了它为他们做了什么。@Seth:噢,糟糕。我的意思是我同意你的看法:)我只是想把构建编译器的比喻扩展到构建计算器。。。。或者std::vector-在让学生使用计算器之前必须教他们长除法:)@Seth:+1:)你可能想提到将malloc/new与free/delete耦合。@Fredwolf,Seth:许多学生在毕业到更高级别的语言之前都学过机器/汇编。他们可能没有建造计算器,但他们至少学会了它为他们做了什么。@Seth:噢,糟糕。我的意思是我同意你的观点:我只是想把编译编译器的比喻扩展到构建计算器。如果你的问题是关于如何在C++中动态地创建2D数组,那就是对这个问题的一种欺骗。然而,这并不是你的问题所在(而是关于如何修复编译器错误/将malloc的结果分配给
int*
)。但是你可能想读这个问题:如果你的问题是关于如何在C++中动态地创建2D数组,那就是对这个问题的一种欺骗。然而,这不是什么