배열이란?

자료구조 정의하기

  • 자료구조: 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계

배열 다루기

  • 배열: 같은 자료형의 변수로 이루어진 요소(element)가 모여 직선 모양으로 줄지어 있는 자료구조
     // 자료형 배열이름[요소개수];
     int a[5];
  • run-time이 아닌 compile-time에 계산되기 때문에 요소의 개수는 상수만 사용할 수 있음.
  • 인덱스 식(subscript expression): 배열의 개별 요소에 접근할 때 사용.
    정수형 인덱스(subscript)를 인덱스 연산자 [] 안에 넣은 식.
  • 배열 a 원소의 각 자료형은 int형, 배열 a 자체의 자료형은 int[5]
  • 선언과 동시에 초기화가 가능
    int a[5] = { 1, 2, 3, 4, 5 };
    int b[] = { 1, 2, 3, 4, 5, 6 }; // 요소 개수는 6으로 초기화
  • 배열의 요소 개수: sizeof(a) / sizeof(a[0]);
    - sizeof(a): 전체 배열이 할당된 메모리의 크기
    - sizeof(a[0]): 각 요소가 할당된 메모리 크기
    즉, 배열의 전체 크기를 베열 요소의 크기를 나눈 것
    cf) sizeof(a) / sizeof(int)로 구하는 것은 안전하지 않음. → 배열의 자료형이 달라질 때 대응할 수 없기 때문. 배열 a의 자료형이 long으로 바뀌면 sizeof(a) / sizeof(long)으로 바뀌어야 함

메모리 할당과 동적 객체 생성하기

(C Ver)

  • 프로그램 실행하는 도중 원하는 시점에 메모리를 확보하기 위해 힙 영역에 기억 장소를 확보

        callocmalloc
    헤더#include <stdlib.h>
    형식void *calloc(size_t nmemb, size_t size);void *malloc(size_t size);
    예시ex) int *x = (int*)calloc(1, sizeof(int));ex) free(x)
    해설크기가 size인 자료가 nmemb개만큼 들어갈 메모리를 할당합니다.
    할당한 메모리 영역은 모든 비트가 0으로 초기화 됩니다.
    크기가 size인 메모리를 할당합니다.
    할당한 메모리의 값은 정의되지 않습니다.
    반환값메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환.
    실패하면 NULL 포인터를 반환.
    메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환.
    실패하면 NULL 포인터를 반환.
  • 프로그램을 실행하는 도중 원하는 시점에 확보된 메모리 해제

    free()
    헤더#include <stdlib.h>
    형식void free(void *ptr);
    해설ptr이 가르키는 메모리를 해제하여 이후에 다시 할당할 수 있도록 함.
    ptr이 NULL포인터인 경우 아무것도 하지 않습니다.
    이 때 ptr로 전달된 실인수(actual argument)가 calloc, malloc, realloc 함수에 의해 반환된 포인터가 아니거나
    영역이 free 함수, realloc 함수를 호출하여 이미 해제된 영역이라면 아무것도 하지 않습니다.
    반환값없음
#include <iostream>
#include <stdlib.h>
using namespace std;

int main(){
    int *x = (int*)calloc(1, sizeof(int));   // 메모리 동적 할당
    if(x == NULL) cout << "메모리 할당 실패";
    else {
        *x = 57;
        cout << "*x = " << *x << "\n";
        free(x);                                  // 메모리 해제
    }
}

(C++ Ver)

  • new와 delete

        newdelete
    헤더#include <iostream>
    형식void* operator new ( std::size_t count );void operator delete ( void* ptr ) noexcept;
    예시ex) int *point = new int[5];ex) delete[] point; // 배열 형태 메모리 할당해제
    해설크기가 size인 자료가 nmemb개만큼 들어갈 메모리를 할당합니다.
    할당한 메모리 영역은 모든 비트가 0으로 초기화 됩니다.
    크기가 size인 메모리를 할당합니다.
    할당한 메모리의 값은 정의되지 않습니다.
    반환값메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환.
    실패하면 NULL 포인터를 반환.
    없음
#include <iostream>
using namespace std;

int main(){
    int *x = new int;   // 메모리 동적 할당
    if(x == NULL) cout << "메모리 할당 실패";
    else {
        *x = 57;
        cout << "*x = " << *x << "\n";
        delete x;       // 메모리 해제
    }
}

NULL

  • Null은 <stdio.h> 파일에 매크로로 정의되어있고, 값이 없음을 의미한다
  • #define NULL((void *)0)
  • 선언(declaration)은 컴파일러에게 대상에 대한 정보를 알려줍니다. 다만 실제 내용을 할당하지 않으므로 메모리를 사용하지 않음.
  • 하지만 정의(definition)는 컴파일러에게 대상의 실제 내용을 생성하게 합니다. 실제 내용을 생성하고 할당하므로 메모리를 사용합니다.
  • 즉, 매크로로 정의된 NULL(매크로 함수)는 컴파일 타임에 치환된다.

C언어의 메모리 구조

프로그램을 실행하면 운영체제는 프로그램이 사용할 메모리 영역을 할당

  • 할당 시기: 프로그램이 실행될 때마다 할당
  • 할당 공간: 메인 메모리(RAM)
  • 할당 용도: 프로그램 실행에 필요한 메모리 영역(지역변수, 전역변수 선언을 위해) 할당
  • 데이터
    전역변수와 정적(static) 변수가 할당되는 영역.
    프로그램을 시작하면 할당하고, 프로글매을 종료하면 메모리에서 해제함

  • 스택
    함수 호출시 생성되는 지역 변수와 매개변수가 저장되는 영역
    함수 호출이 완료되면 사라짐


  • 필요에 따라 동적으로 메모리를 할당
    힙 영역은 할당해야할 메모리의 영역의 크기를 run-time에 결정해야하는 경우에 사용.
    힙 영역은 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈 공간(free space)
    즉, 동적 할당을 통해 생성된 동적 변수(dynamic variables)를 관리하기 위한 영역.
    힙 영역은 다른 영역(데이터 스택 등)을 모두 할당하고 남은 공간
    남은 공간이라고 해서 영역에 제한이 있는 것은 아니고, 시스템의 메모리 영역의 여유 공간에 따라서 달라짐.
    Java나 C++ 등에서 new를 사용했던 것처럼 C에서는 malloc, calloc 함수 등을 사용해 동적으로 생성하는 변수를 저장하기 위해 할당하는 영역.

데이터 영역과 스택 영역은 컴파일러가 미리 공간을 예측하고 할당할 수 있지만, 동적 변수는 어느 시점에 얼마만큼의 공간을 할당할지 정확하게 예측할 수 없으므로 run-time에 결정.

구조체란?

구조체 살펴보기

  • 구조체: 임의의 자료형을 조합하여 다시 만든 자료구조.

  • 구조체의 선언

    /*---구조체 xyz---*/
    struct xyz {
            int x;     // int형 멤버
            long y;    // long형 멤버
            double z;  // double형 멤버
    };
    
    /*---struct xyz형 a형의 정의---*/
    struct xyz a;
    
    /*---a를 가리키는 포인터---*/
    struct xyz *p = &a;
  • 멤버 접근연산자 (.) ex) a.x

  • 구조체 객체에 대한 포인터로 멤버 접근하는 형식 (->) ex) p->x

  • struct xyz 대신 XYZ로 쓰려고 할 때:

    typedef struct xyz XYZ;
    XYZ a;
    XYZ *p = &a;
profile
iOS🌱

0개의 댓글