返回指向struct的指针或传入它?

时间:2013-02-24 22:26:47

标签: c function pointers struct

哪些更有效,更好的代码?还是有其他方法我应该这样做?

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);
}

谢谢!我为任何错别字道歉。

1 个答案:

答案 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_newnew_foo更常见。 })