动态创建2d数组

xar*_*rzu 0 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[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
        {
        fprintf(stderr, "out of memory\n");
        exit or return
        }
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在VS 2011中,它表示array = malloc(n*sizeof(int*)); void*无法分配给int*如何解决?

Set*_*gie 5

Visual C++是一个C++编译器,C++要求你void*显式地转换,不像C允许隐式转换void*s.

尝试

array = (int**)malloc(nrows * sizeof(int *));
Run Code Online (Sandbox Code Playgroud)

但是,这就是你在C中的表现,如果你以后决定将数据从ints 更改为某种对象,则不会调用该对象的构造函数,因为你使用过malloc.如果你想做更多的C++ - ish方式,适用于所有数据类型,你可以使用new:

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

for (int i = 0; i < nrows; ++i)
    array[i] = new int[ncolumns];
Run Code Online (Sandbox Code Playgroud)

这种方式还可以使您不必计算对象的大小n * sizeof(type).

但是,如果您选择使用malloc分配内存块,则必须使用free它来取消分配; 相反,如果您选择使用new分配内存块,则需要使用delete它来删除它(请记住delete[]在数组delete上使用而在非数组上使用plain).使用delete上的malloc"d存储器块或free在一个new"未定义的行为d存储器块的结果.原因是malloc堆上new分配内存但在免费存储上分配内存.它们可能恰好相同; 事实上,一些实施newdelete使用malloc,并free在引擎盖下,但那是编译器的依赖性,所以不要永远做.

请注意,您可以使用malloc,并free在同一个程序,但不建议,因为你可以很容易忘记其中一个分配的内存块特定,并使用了错误的释放函数就可以了.