动态创建2d数组

时间:2011-04-28 03:27:45

标签: 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
        }
    }

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

1 个答案:

答案 0 :(得分:5)

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

尝试

array = (int**)malloc(nrows * sizeof(int *));

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

new

通过这种方式,您还可以免于使用int** array = new int*[nrows]; for (int i = 0; i < nrows; ++i) array[i] = new int[ncolumns]; 计算对象的大小。

,如果您选择使用n * sizeof(type)分配内存块,必须使用malloc取消分配内存;相反,如果您选择使用free来分配内存块,则需要使用new将其删除(请记住在数组和{{1}上使用delete在非数组上)。在delete[]内存块上使用delete或在delete内存块上使用malloc会导致未定义的行为。原因是free上分配内存,但new免费商店上分配内存。它们可能恰好相同;实际上,mallocnew的某些实现使用了newdelete,但这是依赖于编译器的,所以不要永远做吧。

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