我想定义一个自定义结构,其中包含两个可动态分配的整数数组a
和b
。为了为数组分配内存并使用值初始化数组,我编写了一个“构造函数”函数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);
我的任务是编写“优雅”的代码。因此,我的问题是:
a
的数组b
和initp
中元素的数量?这是参数k
。在上面的示例中,它是2和1。(int[])
进行“显式”转换?答案 0 :(得分:1)
是否可以避免指定编号。传递到
a
的数组b
和initp
中元素的数量?
否。
替代方法:使用宏魔术创建宏INITP(l, a, b, f)
,确定a
,b
是真正的数组,其数组元素计数,确保其计数相等,然后调用{{1} }。
我不喜欢这种方法,但是它是可行的-有局限性。
注意:有关 size 的信息,请考虑initp()
与size_t
。
是否可以避免在函数调用中使用(int [])进行“显式”转换?
对于int
,(int[]){3, 4}
不是强制转换。它只是复合文字的形式,并且必须组成一个。
如果您对提高代码质量有一般性的评论和批评。
有关工作代码,请考虑使用Code review进行更深入的审查。
我会依次分配每个阵列-通常比隔行扫描快或快。
(int[])
句柄分配失败。
创建一个 memcpy(f->a, a, sizeof f->a[0] * k);
memcpy(f->b, b, sizeof f->b[0] * k);
伴侣,例如initp()
。
为清楚,检查和维护而改进分配。
void uninitp(pair *f)
// f->a = (int *) calloc(l, sizeof(int));
f->a = calloc(l, sizeof f->a[0]);
,const
注意事项。
嗯,这对于这里的评论来说太全面了,所以现在就结束了。