gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:26 25 4
gpt4 key购买 nike

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

名为的自定义结构:

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. 是否可以避免指定编号。传递给 initp 的数组 ab 中的元素数量?这是参数 k。在上面的示例中,它是 2 和 1。
  2. 是否可以在函数调用中避免使用 (int[]) 进行“显式”转换?
  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. constrestrict注意事项。

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

关于c - 在自定义结构中管理可动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52994110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com