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*如何解决?
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分配内存但在免费存储上分配内存.它们可能恰好相同; 事实上,一些实施new和delete使用malloc,并free在引擎盖下,但那是编译器的依赖性,所以不要永远做.
请注意,您可以使用malloc,并free在同一个程序,但不建议,因为你可以很容易忘记其中一个分配的内存块特定,并使用了错误的释放函数就可以了.
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |