在自定义结构中动态管理可分配数组

时间:2018-10-25 16:31:17

标签: c struct casting malloc calloc

我想定义一个自定义结构,其中包含两个可动态分配的整数数组ab。为了为数组分配内存并使用值初始化数组,我编写了一个“构造函数”函数initp。我的方法如下。

名为pair的自定义结构:

typedef struct {
    ...
    int  l;  // length of compositions
    int  k;  // no. of elements in compositions
    int *a;  // composition 1
    int *b;  // composition 2
} pair;

用于初始化自定义结构的函数:

int initp(..., int l, int k, int a[], int b[], pair *f) {
    ...
    f->l = l;
    f->k = k;

    // allocate composition arrays
    f->a = (int *) calloc(l, sizeof(int));
    f->b = (int *) calloc(l, sizeof(int));

    // initialise composition arrays
    for (int i = 0; i < k; i++) {
        f->a[i] = a[i];
        f->b[i] = b[i];
    }
}

主程序中的函数调用:

// initialise pairs
pair f1, f2;
initp(..., 10, 2, (int[]){3, 4}, (int[]){7, 6}, &f1);
initp(..., 10, 1, (int[]){4},    (int[]){9},    &f2);

我的任务是编写“优雅”的代码。因此,我的问题是:

  1. 是否可以避免指定编号。传递到a的数组binitp中元素的数量?这是参数k。在上面的示例中,它是2和1。
  2. 是否可以避免在函数调用中使用(int[])进行“显式”转换?
  3. 如果您对提高代码质量有一般性评论和批评,请告诉我。

1 个答案:

答案 0 :(得分:1)

  

是否可以避免指定编号。传递到a的数组binitp中元素的数量?

否。

替代方法:使用宏魔术创建宏INITP(l, a, b, f),确定ab是真正的数组,其数组元素计数,确保其计数相等,然后调用{{1} }。

我不喜欢这种方法,但是它是可行的-有局限性。

注意:有关 size 的信息,请考虑initp()size_t


  

是否可以避免在函数调用中使用(int [])进行“显式”转换?

对于int(int[]){3, 4}不是强制转换。它只是复合文字的形式,并且必须组成一个。


  

如果您对提高代码质量有一般性的评论和批评。

  1. 有关工作代码,请考虑使用Code review进行更深入的审查。

  2. 我会依次分配每个阵列-通常比隔行扫描快或快。

    (int[])
  3. 句柄分配失败。

  4. 创建一个 memcpy(f->a, a, sizeof f->a[0] * k); memcpy(f->b, b, sizeof f->b[0] * k); 伴侣,例如initp()

  5. 为清楚,检查和维护而改进分配。

    void uninitp(pair *f)
  6. // f->a = (int *) calloc(l, sizeof(int)); f->a = calloc(l, sizeof f->a[0]); const注意事项。

嗯,这对于这里的评论来说太全面了,所以现在就结束了。