Programming Languages/C

08 구조체와 동적할당

ubiquitous4g 2021. 5. 8. 15:33

구조체

구조체(Struct) 선언과 맴버 접근

구조체는 배열과 같은 사용자 정의 자료형(User-Defined Data Type)이다.

struct 키워드를 통해 구조체 자료형을 선언하고, 사용한다.

 

구조체 별칭(Alias)

typedef 키워드를 통해 struct name -> alias 로 간단히 사용한다.

구조체 동적할당

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 구조체 별칭과 포인터

int main(void)
{
    typedef struct Person
    {
        char name[20];
        char addr[50];
        int age;
    } as_;

    as_ *ptr = malloc(sizeof(as_));
    as_ a;
    ptr = &a;

    strcpy(ptr->name, "이순신"); // (*ptr).name
    strcpy(ptr->addr, "한국");   // (*ptr).addr
    ptr->age = 20;

    printf("%s\n", ptr->name);
    printf("%s\n", ptr->addr);
    printf("%d\n", ptr->age);

    free(ptr);
}

패딩 바이트

구조체의 요소는 같은 크기끼리 모아준다.

// 전체: 24 바이트 / 패딩: 12바이트 (7 + 5)
struct Test1 {
    char a;    // ⬛⬜⬜⬜⬛⬛⬛⬛  // 1바이트 [+ 7바이트 패딩]
    double b;  // ⬛⬛⬛⬛⬛⬛⬛⬛  // 8바이트               
    short c;                            // 2바이트
    char d;    // ⬛⬛⬛⬜⬜⬜⬜⬜  // 1바이트 [+ 5바이트 패딩] 
};

// 전체: 16 바이트 / 패딩: 4 바이트
struct Test2 {
    char a;                             // 1바이트
    char d;                             // 1바이트
    short c;   // ⬛⬛⬛⬛⬜⬜⬜⬜  // 2바이트  [+ 4바이트 패딩]
    double b;  // ⬛⬛⬛⬛⬛⬛⬛⬛  // 8바이트                
};

printf("%ld \n", sizeof(struct Test1)); // 24 Byte
printf("%ld \n", sizeof(struct Test2)); // 16 Byte
// 32bit(4Byte) OS                       🔲블럭 읽기
CASE 1: ⬛🔳⬜⬜ 🔲🔲🔲🔲             // 1번
CASE 2: ⬛⬜⬜⬜ 🔲🔲🔲🔲 🔳⬜⬜⬜  // 공백 필요
CASE 3: ⬛🔳🔲🔲 🔲🔲                  // 2번