哪些更有效,更好的代码?还是有其他方法我应该这样做?
typedef struct foo {
int width;
int height;
} foo;
...这两个示例中的typedef,但它确实是一个任意结构......
foo *new_foo (int width, int height) {
foo *f
if ((f = malloc(sizeof(foo)))==NULL) return NULL;
f->width = width;
f->height = height;
return foo;
}
void del_foo (foo *f) {free(f);}
int main () {
int width = 3;
int height = 4; // arbitrary values
foo *f
f = new_foo(width, height)
// do something with foo here
del_foo(f);
}
或
int new_foo (foo *f, int width, int height) {
f->width = width;
f->height = height;
return 0;
}
int main () {
int width = 3;
int height = 4; // arbitrary values
foo *f
if ((f = malloc(sizeof(foo)))==NULL) return NULL;
new_foo(f, width, height)
// do something with foo here
free(f);
}
谢谢!我为任何错别字道歉。
答案 0 :(得分:1)
foo* new_foo(int width, int height)
似乎更适合名称中new
的函数(new
意味着动态分配给具有C ++经验的人员。)
void foo_init(foo f, int width, int height)
如果您希望允许客户端在堆栈和堆上声明foo
对象,那么将是合理的。您也可以选择提供两者,将new_foo
作为malloc
实施,然后调用foo_init
。
如果你提供一个分配内存的函数,那么提供一个破坏对象的函数是合理的 - foo_destroy(foo )
(del_foo
在你的问题中?)
最后,次要,重点 - 如果你在名字前面加上他们操作的结构而不是在结尾添加结构,你可以更明显地对相关函数进行分组(即foo_new
比new_foo
更常见。 })