2013-02-24 4 views
0

다음 중 어느 것이 더 효율적이고 우수한 코드입니까? 아니면이 일을 해야하는 다른 방법이 있습니까? 구조체에 대한 포인터를 반환하거나 전달하려면?

typedef struct foo { 
int width; 
int height; 
} foo; 

... 모두 아래의 예에서이 타입 정의,하지만 정말 임의의 구조 ...

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
foo* new_foo(int width, int height) 

는 (C++의 경험을 가진 사람들에게 동적 할당을 의미합니다 new) 이름에 new와 기능에 대한 바람직한 것 같다. 당신은 클라이언트가 힙뿐만 아니라 스택에 foo 객체를 선언 할 수 있도록하려는 경우

void foo_init(foo f, int width, int height) 

이 합리적 일 것이다. 두 가지를 모두 제공하고 new_foomalloc으로 구현 한 다음 foo_init을 호출 할 수도 있습니다.

메모리를 할당하는 기능을 제공하는 경우, 또한 오브젝트 파괴하는 기능을 제공하는 합리적인 것 - (? 귀하의 질문에 del_foo) foo_destroy(foo)

마지막으로, 작은, 지점 - 당신이 더 많은 수 분명히 관련 함수를 그룹화하려면 끝에 구조체를 추가하는 대신 해당 구조체에 접두사를 붙이면됩니다 (즉 은 new_foo보다 일반적입니다)

+0

미안하지만 오타가 발생했습니다. "void foo_init (foo * f, int 폭, int 높이) "! – sfi

+0

좋아, 그건 아주 중요한 오타 였어! 나는 조금 더 많은 정보로 내 대답을 업데이트했습니다. – simonc

+0

대단히 감사합니다! 사소한 점, 흥미롭고 유용한 정보에 감사드립니다. – sfi

관련 문제