Mac*_*las 1 c c++ malloc arduino avr-gcc
我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):
A:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
Run Code Online (Sandbox Code Playgroud)
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
Run Code Online (Sandbox Code Playgroud)
A和B之间有什么区别吗?编译器会在这两种情况下创建相同的字节代码(arv-gcc)吗?
在C中,你不能分配内存new,因为没有这样的东西.对于C++,您可能更喜欢new以下几个原因:
(std::nothrow)明确地添加)void *)请参阅在什么情况下我使用malloc vs new?关于这个问题的更多讨论.
如果你想分配二维数组并且在编译时至少知道最大尺寸(即它可以是常量表达式),那么你就不要循环了.
int (*arr)[10] = new int [2][10];
Run Code Online (Sandbox Code Playgroud)
如果你想用零预设(也就是说std::calloc),那么使用:
int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10](); // C++03
Run Code Online (Sandbox Code Playgroud)
就像分配的任何数组一样new[],有一个相应的delete[]运算符来释放它:
delete[] arr;
Run Code Online (Sandbox Code Playgroud)
int (*arr)[10] = malloc(5 * sizeof(*arr));
Run Code Online (Sandbox Code Playgroud)
这会分配数组,就像arr[5][10](仅在索引意义上).
要在两者中访问其元素,只需使用:
arr[a][b]
Run Code Online (Sandbox Code Playgroud)
要释放它,你基本上做:
free(arr);
Run Code Online (Sandbox Code Playgroud)
在C++中,你还需要处理强制转换并可能使用它来限定它std,因此它std::malloc(特别是如果包含cstdlib,因为stdlib.h在C++标准中不推荐使用标头):
const int N = 10;
int (*arr)[N] =
static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
Run Code Online (Sandbox Code Playgroud)
但我不认为你会喜欢它.
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |