动态创建2-dim数组的通用方法?

时间:2014-08-21 04:37:49

标签: c arrays

我很高兴使用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);
}   

3 个答案:

答案 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(或等效地,memset0)仅为整数类型生成明确定义的值(或者如果您知道您的系统使用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。它只会增加错误的机会。