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

Managing dynamically allocatable arrays inside a custom structure

我想定义一个自定义结构,其中包含两个可动态分配的整数数组 ab。为了为数组分配内存并用值初始化数组,我编写了一个 "constructor" 函数 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);

我的任务是编写 "elegant" 代码。因此,我的问题是:

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

Is it possible to avoid specifying the no. of elements in arrays a and b passed to the initp?

没有

备选方案:创建宏 INITP(l, a, b, f) 并使用宏魔法确定 ab 是真正的数组,它们的数组元素计数,确保它们的计数相等,然后调用 initp().

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

注意:对于 大小 信息,请考虑 size_tint


Is it possible to avoid "explicit" casting with (int[]) in the function call?

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


if you have general comments and criticism on improving the quality of the code.

  1. 对于工作代码,请考虑 Code review 进行更深入的审查。

  2. 我会依次分配每个数组 - 通常与隔行扫描一样快或更快。

     memcpy(f->a, a, sizeof f->a[0] * k);
     memcpy(f->b, b, sizeof f->b[0] * k);
    
  3. 处理分配失败。

  4. 创建 initp() 随播广告 void uninitp(pair *f)

  5. 改进分配以实现清晰、审查和维护。

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

嗯,这里的评论太满了,现在就结束吧。