8. 배열과 구조체

  1. 배열
  2. 구조체



1. 배열(Array)

배열은 인접하는 메모리 영역을 차지하는 동일한 자료형의 연속적인 객체이다.

배열의 선언과 변수 호출:

int iArr[10] = {};  //대괄호 안을 비워둠으로써 배열의 모든 요소가 0으로 초기화됨
iArr[3];    //배열의 3번 인덱스에 할당되어 있는 변수를 호출한다.

배열의 데이터 크기는 $(배열의 자료형 크기)\times(배열의 요소 개수)$ 가 된다.

위의 iArr 배열의 경우, 4바이트의 int 타입에 10개의 요소를 가지므로, 40 바이트의 크기를 갖는다.




2. 구조체(Struct)

구조체는 “사용자가 정의하는 자료형(user define datatype)” 이다.

구조체의 요소로 C 안에 내장되어있는 원시 자료형(primitive datatype), 또다른 구조체, 배열, 함수 등 다양한 멤버를 가질 수 있다.

//구조체의 선언
struct MyDataType
{
    int i;
    float f;
    short sArr[5];
    void func()
    {
    int funclocal = 0;
    std::cout << "func" << std::endl;
    }
};
//구조체 내부 요소 접근
int main()
{
    MyDataType data = {};   //data 라는 이름의 MyDataType 자료형 구조체를 선언, 0으로 초기화
    data.i = 10;    //data 구조체 안의 i 변수에 할당
    data.f = 3.14f; //data 구조체 안의 f 변수에 할당
    data.sArr[2] = 3;   //data 구조체 안의 sArr 배열 2번 인덱스에 할당
    data.func();    //data 구조체 안에 정의된 func 함수 호출

    return 0;
}


구조체의 크기는 두 조건을 따라서 결정된다:

  1. 가장 큰 member 의 자료형을 기준으로 정렬된다.

  2. 메모리 배치는 위에서부터 순차적으로 이루어지며, 배치되는 해당 자료형의 바이트 크기의 배수에 해당하는 위치에 정렬된다.

  3. 만약 #pragma pack(n)(n은 1, 2, 4, 8)이 선언되었다면 정렬 시 n바이트 단위로 패킹을 진행한다.

alt text

또한, 배열의 요소를 구조체로 정의할 수도 있다. 배열을 원시 자료형이 아닌 구조체로 선언하면 배열의 요소들은 모두 별개의 구조체가 된다.

MyDataType structArr[10] = {};

alt text