코딩 39일차 C/C++

마스터피스·2023년 11월 13일
0

C/ C++ 

목록 보기
10/35
post-thumbnail

포인터 3 - 메모리 동적 할당 / 배열

1) 포인터와 배열

  • 포인터는 사실상 배열과 비슷한 형태이기 때문에 포인터 타입 변수에 배열에서 사용했던 것과 같은 형태의 접근 방법인 대괄호를 입력하고 숫자를 입력하는 것으로 해당 포인터를 '배열과 같은 방법'으로 활용할 수 있습니다.

2) 배열과 포인터, 문자열

  • 제가 방금 배열과 포인터는 근본적으로 같다고 말했습니다. 이는 문자열에도 동일하게 적용할 수 있습니다. 때문에 문자열이 배열이었으므로 문자열을 포인터 형태로 사용할 수 있는 것이죠

3) 메모리 동적 할당

  • 배열과 포인터가 근본적으로 같다 라는 이야기는 결국 메모리 동적 할당으로 이어지게 됩니다.

4) malloc( ... )

  • 메모리 동적 할당은 cstdlib 헤더파일에 존재하는 malloc( ... ) 함수를 이용해서 할당되게 됩니다. 이 동적 할당하는 함수인 malloc 함수를 이용하게 되면 컴퓨터의 메모리 Heap 이라고 하는 영역에 메모리가 할당이 되며, 이 Heap 영역의 메모리의 주소값을 malloc 이라는 함수가 반환해 줍니다. 주소값이 반환되었으니까 포인터 데이터 타입이 반환이 되고 이 메모리를 얼마나 할당하느냐 (데이터 타입의 크기만큼만 할당하느냐) 혹은 데이터 타입의 크기보다 훨씬 크게 만드느냐에 따라서 단일 메모리 할당이 가능하거나, 배열 또한 메모리 동적 할당을 할 수 있게 됩니다. 여기에서는 메모리 동적 할당을 왜 해야 하느냐 에 대한 한가지 이유를 설명합니다

5) -> 표현 // 중요함 !!

  • 구조체 포인터의 멤버 변수에 접근하기 위해 (*변수).멤버 와 같은 불편한 방법을 대체하기 위해 변수->멤버 와 같은 방법으로 멤버에 접근하는 방법이 있습니다.

화살표를 통해 나타낸다! 가장 중요한 내용

#include "Header.h"

struct Marine {
    int hp;
    int mp;
    char name[20];
};

Marine* foo() {
    Marine* m = (Marine*)malloc(sizeof(Marine));
    m->hp = 100;
    m->mp = 50;
    strcpy(m->name, "Jim Raynor");
    return m;
}

int main() {

    Marine* m = foo();

    printf("%s", (m->name);
    return 0;

}

프로그램이 종료될 때까지 메모리를 계속 잡아먹기 때문에 free 함수로 할당을 해제시켜야 한다.

6) free( ... )

  • malloc 으로 할당된 메모리 공간은 프로그래머가 free 함수를 사용하기 전까지 지속적으로 메모리 영역을 차지하고 있습니다. 이것을 free 라는 함수를 사용하여 메모리 해제를 하지 않으면 메모리 누수의 원인이 됩니다

7) 동적 메모리 할당으로 가변 길이의 배열 만들기

  • 동적 메모리 할당 함수인 malloc 함수로 가변 길이의 배열을 만들 수 있습니다. 이를 예제와 함께 설명합니다.
#include "Header.h"


int main() {

    int* myArray;

    int input;
    fseek(stdin, 0, SEEK_END);
    printf("숫자를 입력하시면 배열이 만들어 집니다. :");
    scanf("%d", &input);

    myArray = (int*)malloc(sizeof(int) * input);

    for (int i = 0; i < input;i++) {
        myArray[i] = i * 10;
    }

    for (int i = 0; i < input; i++) {
        printf("myArray[%d] = %d\n", i, myArray[i]);
    }

    return 0;

}

과제형 문제)

sol)
#include "Header.h"

int main() {

    int* myArray;
    int input;



    printf("숫자를 입력하시면 배열이 만들어 집니다. :");
    fseek(stdin, 0, SEEK_END);
    scanf("%d", &input);

    myArray = (int*)malloc(sizeof(int) * input);

    for (int i = 0; i < input; i++) {
        myArray[i] = (i + 1) * 2;
    }

    for (int i = 0; i < input; i++) {
        printf("myArray[%d] = %d\n", i, myArray[i]);
    }

    free(myArray);

    return 0;

}
profile
코딩 일지

0개의 댓글