C 프로그래밍: 배열과 링크드 리스트

  • Post author:
  • Post category:
  • Post comments:2 Comments
  • Post last modified:January 25, 2016

알고리즘 프로젝트로 실로 오랜만에 C 언어로 프로그램을 작성했다. 숙제하는 도중에 다른 사람이 쓴 코드를 여러 개 읽었는데, 한 가지 눈에 거슬리는 점이 있었다.

typedef struct {
    int v;          // neighboring vertex
    int weight;     // weight
} edge;

edge* findLongestEdge(struct edge *edges)
{
    ............
}

이름만 봐도 이 함수가 하는 일이 뭔지 알 수 있다. 그래프의 간선 집합을 매개변수로 받아, 가장 긴 것을 반환한다. 얼핏 보기엔 아무 문제 없다. 하지만 내가 보기엔 문제가 있다.

내가 이 프로그램을 작성한 사람이라면 괜찮다. 하지만 어느날 전임자에게 레가시 코드를 넘겨 받았다면 어떨까? struct edge *edges가 edge의 배열을 뜻할까? 그럴수도 있고, 그렇지 않을 수도 있다. 함수 이름을 봐선 여러 개의 edge를 넘겨 받는 건 분명하다. 그러나 배열로 넘겨 받는다는 보장은 없다. 특히 C나 C++에선 링크드 리스트를 많이 사용한다. 구조체 edge가 이렇게 구현되어 있다면 어떨까?

typedef struct {
    int v;          // neighboring vertex
    int weight;     // weight
    struct edge *next;
} edge;

이런 경우라면 struct edge *edges는 edge의 배열이 아니라, 어떤 edge 인스턴스의 포인터일 것이다. 그러니 가독성을 높이기 위해서 첫 번째 경우는 edge* findLongestEdge(struct edge edges[])로, 두 번째 경우는 edge* findLongestEdge(struct edge *edges)로 표기하는 편이 낫다고 생각한다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
겐도
16 years ago

음.. 요즘은 어레이를 기술하는구낭 @.@;
보통은 typedef로 어레이형 타입(C 특성답게 말로만)을 선언해 줬는데;;

최재훈
16 years ago

옛날엔 안 되었던가요? 제가 기억하는 한도 내에서는 줄곧 이렇게 프로그래밍해 왔는데, 또 오래 전 컴파일러에선 오류가 났던 것 같기도 하고….. 기억이 가물가물해요. ㅠ.ㅠ