티스토리 뷰

struct 안 쓰면 불편한 점

c언어 struct의 필요성과 장단점 그리고 사용시 주의할 점에 대한 이야기입니다.

car_name이란 변수를 참조하는 함수들이 100개 있다고 가정하죠. 함수 선언과 정의하는 부분들이 있을 겁니다. 그런데 car_color란 변수를 추가해야 할 일이 생겼습니다. 그래서 100번 수정해서 함수들 마다 데이터 하나를 추가했습니다. 그런데 또 수정 요구가 들어왔어요. 오 마이… 이번에는 car_size입니다. 헐….. OTL 이런 반복작업을 계속 해야 할까요?

struct를 쓰면 좋은 점

위의 이야기와 같은 불상사를 막으려면 struct를 사용하면 됩니다. c언어의 struct 구조체는 여러 형의 데이터를 묶어야 할 때 사용합니다. 즉 구조화된 데이터형이죠. 이렇게 하면 좋은 점은 함수에 데이터를 넘길 때 해당 구조체만 넘겨주면 됩니다.

이렇게 하면 차 후에 참조되는 함수에 파라미터를 추가하더라도 함수의 선언을 바꾸지 않고도 전달 하고자 하는 데이터를 바꿀 수 있다는 장점이 있습니다. 구조체 선언에서 필드만 하나 추가 혹은 삭제하면 됩니다. 또 다른 장점으로는 함수에 구조체만 달랑 넘겨주기 때문에 읽기도 쉽습니다.

struct는 전달 데이터를 읽기 쉽고 간편하게 합니다.

/* 이전 코드 */
void build_car(char *car_name, char car_color, int car_size);
{
    ....
}

/* 변경 코드 */
typedef struct {
    char *car_name;
    char car_color;
    int car_size;
    char *brand_name;
    char age;
} CAR;

void build_car(CAR car);
{
    ....
}

c언어 struct 사용시 주의할 점

임베디드 c언어에서 struct의 사용에 주의하지 않으면 sizeof함수 사용시 오류 값이 발생된다거나 원하는 값이 나오지 않을 수 있습니다.

가령 아래 예제의 경우 전체 struct의 값은 1+20+4=25가 나올 것 같지만 사실은 28이 나옵니다. 이는 정렬 제약 조건을 충족시키기 위해 패딩이 추가 되었기 때문입니다. 이러한 데이터 구조 정렬은 프로그램의 성능과 정확성에 모두 영향을 미칩니다.

typedef struct
{
    uint8_t id;             // 2 byte + 2byte(padding)
    uint8_t name[20];       // 20 byte
    uint32_t number;        // 4 byte
} person_t;

예제에서 number는 기대하는 값이 들어있지 않을 가능성이 높습니다. 왜냐하면 정렬을 위해 앞에서 임의의 패딩이 추가되었거나 뒤에서 추가 되기 때문입니다. 더미 값이 더해져서 매번 그 값이 바뀔 것 입니다. 이처럼 잘못 정렬 된 액세스는 하드 오류 (종종 SIGBUS) 혹은 소프트 오류를 일으킵니다.여러모로 많은 문제를 야기합니다.