티스토리 뷰
구조체(structure)은 형태가 다른것도 모아서 만들 수 있다.
배열
1)저장공간 확보
2)자료형도 컴파일러가 인식할 수 있게 됨
구조체
1) 컴파일러에게 신고 먼저 해줌(이런 구조체 쓸거라고!)
2) 자료형으로 변수 선언
================================
#1 구조체 형 선언
struct student
{int num;
double grade;
};
but 변수 선언과는 다르다
#2
main함수 밖에다 선언해서 프로그램 전체에서 사용하게 해준다!
struct student{
int num;
double grade;
};
int main(void){
struct student a;
}
이런식으로 선언을 하면 a를 위해서 메모리가 얼마나 확보 될 까? 멤버들의 크기 다 더한 12바이트(int + double) 만큼 확보해 주게 된다. 100번지 부터 111번지 까지 컴파일러가 확보해 주었다고 생각해 보자.
#3 구조체 멤버의 사용
멤버 접근 연산자를 사용해서 구조체의 멤버에 접근할 수 있다.
a.num = 35;
a.grade
이런식으로 dot을 사용해서 접근한다.
scanf(“%d”, &a.num);
Q)근데 왜 sizeof(a)하면 12바이트 아니고 16바이트 나올까? 바로 ‘패딩 바이트’가 들어가기 때문이다. cpu가 메모리에 접근할 때, 효율적이기 위해서 byte alignment 를 이용한다.
위의 코드를 보면, int 와 double을 선언하였다. 항상 기준은 제일 바이트 수가 큰 자료형이 기준이다. 이 코드에서는 double이 가장 크므로, 기준이 8바이트가 된다.
4 + (4) <-패딩바이트
8
이런 식으로 선언하게 된다. 하지만 패딩바이트가 메모리 너무 많이 잡아먹을수도 있다!
struct student{
char ch1;
short num;
char ch2;
int score;
double grade;
char ch3;
}
32비트 컴퓨터 = 4바이트가 기본 단위
32비트 리눅스 컴퓨터라고 가정해 보자.
struct A{
char a;
int b;
}
‘배열의 연장’ 이라고 생각하면 된다!
int[0], int[1] 이런식으로 생각하면 됨.
ch1 * num num ch2 * * *
s s s s * * * *
g g g g g g g g
ch3 * * * * * * *
32바이트 필요하지만 실제 사용은 17바이트...
->자료형에 따라서 크기 조절 잘 하면 패딩바이트 줄일 수 있다!
but 가독성 떨어질수도...
메모리 부족할 때는 가독성 희생하고도 메모리 잘 활용할 수도 있다
* 이제는 컴파일러 설정을 바꾸면 자동으로 해준다. 어떤 컴파일러는 코드의 순서를 바꾸어서 패딩 바이트를 줄일 수 있다.
그러므로 우리는 섣불리 패딩 바이트를 예측하면 안된다. sizeof()를 이용하는 것이 좋다!*
다양한 형태의 구조체 멤버
구조체 멤버로 int나 double 같은 자료형들 말고도 다양한 자료형을 사용할 수 있다. 심지어 포인터도 구조체 멤버로 사용 가능하다. 구조체 중첩도 가능하다.
struct student{
char name[20];
int age;
double height;
char *intro;
//(동적할당)
};
name 문자열에 메세지를 넣는다고 생각해 보자.
a.name = “Yejin”;
이런식으로는 넣을 수 없다. a.name은 포인터니까 strcpy함수를 이용해야 접근할 수 있다.
구조체 형을 다른 구조체의 멤버로 이용하기
struct profile{
char name[20];
int age;
double height;
};
struct student{
struct profile pf;
int num;
double grade;
};
struct student a;
패딩바이트 없다고 가정하면 44바이트가 잡힌다. member은 3개가 된다. (pf, num, grade) pf안에는 name, age, height
strcpy(a.pf.name, “hong gil dong”); 이런식으로 접근 해야함
a.pf.age = 17;
a.pf.height = 187.5;
a.num = 315;
a.grade= 3.5;
이중 구조체도 되는구나 ㅎㅅㅎ
구조체 변수 자체는 하나의 변수로 사용 돼!(a처럼)
구조체 변수의 초기화
struct student a, b;
struct student a = {{“yejin”, 17, 187.5}, 315, 3.5};
strcpy(b.pf.name , a.pf.name);
b.pf.age = a.pf.age;
…
이런식으로 넣어주면 힘드니까
b= a;
이렇게 해줘도 된다!
'PL > C' 카테고리의 다른 글
[C] for문의 동작 순서 (0) | 2019.05.31 |
---|---|
[C언어] C언어로 전화번호부 만들기 (0) | 2018.11.05 |
C언어로 틱텍토 만들기 (0) | 2018.11.05 |
typedef 쓰기 (0) | 2018.10.05 |
[C Language] 문자열 정리 (0) | 2018.09.21 |