我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):
A:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
A和B之间有什么区别吗?编译器是否会在这两种情况下创建相同的字节代码(arv-gcc)?
答案 0 :(得分:6)
在C中,你不能按new
分配内存,因为没有这样的东西。对于C ++,您可能更喜欢new
,原因如下:
(std::nothrow)
)void *
)有关此问题的更多讨论,请参阅In what cases do I use malloc vs new?。
如果你想分配二维数组并且在编译时至少知道最大尺寸(即它可以是一个常量表达式),你就不要循环。
int (*arr)[10] = new int [2][10];
如果您希望使用零预设(即std::calloc
),请使用:
int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10](); // C++03
就像new[]
分配的任何数组一样,有一个相应的delete[]
运算符可以释放它:
delete[] arr;
int (*arr)[10] = malloc(5 * sizeof(*arr));
这会分配数组,就像arr[5][10]
一样(仅在索引意义上)。
要在两者中访问其元素,只需使用:
arr[a][b]
要释放它,你基本上可以:
free(arr);
在C ++中,您还需要处理强制转换,并可能使用std
对其进行限定,因此它std::malloc
(特别是如果包含cstdlib
,则为stdlib.h
} C ++标准中不推荐使用header:
const int N = 10;
int (*arr)[N] =
static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
但我不认为你会喜欢它。
答案 1 :(得分:4)
如果你正在使用C ++编译器(而Arduino草图是 C ++),你可能更喜欢new
。做一个简单的int
数组不太重要,但我只留下C遗留的东西只用于 在C环境中运行的代码。
现在,对于C +程序员(那些从未全心全意从C转换到C ++的好奇程序员)来说,现在绝对没有理由存在: - )
答案 2 :(得分:2)
A和B基本相同。
编译器可能会也可能不会创建相同的代码(不是字节代码BTW)。但通常使用new
运算符只需调用malloc
。要查找,请使用gcc -S
编译您的程序,并查看程序集输出。
但是对于c ++程序,您应该更喜欢new
到malloc
。