티스토리 뷰
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) 혹은 소프트 오류를 일으킵니다.여러모로 많은 문제를 야기합니다.
'잉고래의 코딩' 카테고리의 다른 글
윈도우즈에서 리눅스 파티션 삭제하기 (0) | 2023.03.12 |
---|---|
npm install --save-dev를 쓰는 이유 (1) | 2018.03.27 |
'pointer to incomplete class type is not allowed' 컴파일 에러 해결방법 (0) | 2017.10.20 |
sprintf 널문자와 메모리 overflow (0) | 2017.10.17 |
자바스크립트의 객체 정의 3가지 방법 (0) | 2017.04.05 |
- Total
- Today
- Yesterday
- 티스토리
- 캠코더
- 아이나비 탭 XD11 Pro
- 한빛미디어
- 아이나비
- X1 DASH
- 박근혜
- 소니
- c언어
- 소니 핸디캠
- 티스토리챌린지
- SM5
- 블로그
- cc2530
- 소니 캠코더
- 소니 AXP35
- Sony
- 서평
- AXP35
- 아이나비 패드
- 오블완
- qxd1000a
- CSS
- 독후감
- 아이나비 Tab XD9
- 블랙박스
- 아이나비 태블릿
- 아이나비 탭 xd9
- 독서
- 팅크웨어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |