我很高兴使用C
,我编写下面的代码来创建一个2d int
数组,任何人都可以帮助将其泛化为其他类型,如float,double ......?或其他功能可以直接使用?
int** alloc_arrays(int m,int n) {
int **MN = (int **)malloc(sizeof(int *)*m);
if(MN == NULL) {
exit(1);
}
for(int i=0; i<m;i++) {
MN[i] = (int *)malloc(sizeof(int)* n);
if(MN[i] == NULL){
exit(1);
}
memset(MN[i],0, n);
}
return MN;
}
void free_arrays(int **arrays,int m){
if(arrays==NULL){
exit(1);
}
for(int i=0;i< m; i++){
if(arrays[i] ==NULL){
exit(1);
}
free(arrays[i]);
}
free(arrays);
}
答案 0 :(得分:2)
不漂亮,但确实有效:
#include <stdlib.h>
#define ALLOC_ARRAYS(ptr, M, N) do { \
size_t m = (M), n = (N); \
if ( NULL == ((ptr) = malloc(m * sizeof *(ptr))) ) exit(1); \
for (size_t i = 0; i < m; ++i) \
if ( NULL == ((ptr)[i] = calloc(n, sizeof **(ptr))) ) exit(1); \
} while (0)
样本用法:
int main()
{
double **ptr;
ALLOC_ARRAYS(ptr, 5, 10);
}
注意:calloc
(或等效地,memset
到0
)仅为整数类型生成明确定义的值(或者如果您知道您的系统使用IEEE754进行双精度生成)。将每个元素显式初始化为传递给宏的初始化器可能更好;或者有一个不同的宏来初始化。
答案 1 :(得分:1)
您可以使用这样的宏:
#define MAKE_ARRAY(A, N, M) A = calloc(sizeof(**A) * N, M)
你会像这样使用它:
int N = 4;
int M = 10;
int (*x)[M];
double (*y)[M];
MAKE_ARRAY(x, N, M);
MAKE_ARRAY(y, N, M);
/* ... */
free(y);
free(x);
答案 2 :(得分:0)
你不远了。您可以通过改进分配来修复/改进代码。
MN[i] = (int *)malloc(sizeof(int)* n);
应该是:
MN[i] = malloc(sizeof(**MN) * n); /* instead of malloc(sizeof(int)); */
使用变量本身,而不是(int)
使分配通用,并减少错误的机会。 malloc
知道你在分配什么。
如果您想同时分配内容并将其设置为0
,请使用calloc
。您可以将同一行更改为:
MN[i] = calloc (n, sizeof(**MN));
注意:不要投射malloc或calloc。它只会增加错误的机会。