티스토리 뷰

PL/C

구조체

SweetDev 2018. 10. 5. 11:36

구조체(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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함