这种情况下我有一个接收光线行数和列数的函数,我想在函数中动态创建它。
#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 * 我该如何解决这个问题?
答案 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
在免费商店上分配内存。它们可能恰好相同;实际上,malloc
和new
的某些实现使用了new
和delete
,但这是依赖于编译器的,所以不要永远做吧。
请注意,您可以在同一程序中使用malloc
和free
,但不建议这样做,因为您可能很容易忘记哪一个分配了特定的内存块并在其上使用了错误的释放函数