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

알고리즘 프로젝트로 실로 오랜만에 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)로 표기하는 편이 낫다고 생각한다.

Buy me a coffeeBuy me a coffee

최 재훈

Kubernetes, DevSecOps, Golang, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu