TIL (Today I Learned)/C

[c] c언어 구조체의 메모리 사이즈

loki d 2021. 8. 17. 15:29
728x90

c언어 구조체의 메모리 사이즈

1. sizeof 연산자

  • 해당 변수 및 데이터타입의 크기를 정수형태로 되돌려 준다.
int a;
double b;
char c;

sizeof(a)   // 4
sizeof(b)   // 8
sizeof(c)   // 1

2. 구조체의 크기

#include<stdio.h>

typedef struct stu{
    char a;
    int b;
}S;

void main() {
    struct stu a;
    printf("S의 메모리 공간 크기 = %d\n", sizeof(S));
    printf("S의 메모리 공간 크기 = %d\n", sizeof(a));
}
  • a는 1바이트 문자형, b는 4바이트 정소형 그렇다면 5바이트???
    image
      $ gcc c.c -o c // c.c파일을 gcc로 c source를 컴파일
  • 결과는 8바이트가 나온다.
  • 이유는 구조체가 메모리 공간을 잡는 원리에 있다.
    • A. 각각의 멤버를 저장하기 위해서는 기본 4바이트 단위로 구성된다.
    • B. 구조체 각 멤버중에 가장 큰 멤버의 크기에 영향을 받는다.

cf)

예시1

  • a는 1바이트 b는 4바이트
    typedef struct student
    {
    char a;
    int b;
    }S;
    image
  • a는 1바이트 b는 4바이트이지만, 실제로는 A때문에 3바이트의 여유공간을 두게된다.

    예시2

    typedef struct student
    {
    char a;
    char b;
    int c;
    }S;
    image
  • a는 1바이트 b는 1바이트, C는 4바이트의 공간을 두게된다.

    예시3

    typedef struct student
    {
    char a;
    int c;
    char b;
    }S;
    image
  • a는 1바이트 b는 1바이트, C는 4바이트의 여유공간을 두게된다. 선언할 때 같은 자료타입이지만 배열하는 순서에 의해 할당되는 메모리공간이 달라짐을 이해할 수 있다.
  • 따라서 같은 데이터끼리, 작은 자료형을 앞에다가 선언하는 것이 유리하다.

    예시4

    typedef struct student
    {
    char a;
    double b;
    }S;
    image
  • a는 1바이트 b는 8바이트이므로 기본적인 공간을 8바이트로 잡게된다. B의 규칙을 따른다.