반응형

메모리 공간

Code 영역 실행할 프로그램의 명령코드 저장 공간
Data 영역 전역변수 저장 공간
Heap 영역 동적할당 저장 공간
Stack 영역 지역, 매개 변수 저장 공간

 

메모리 할당

- 정적 할당

  - 컴파일 시 할당될 메모리 크기가 결정

  - Stack, Data 영역에 변수로 할당되는 메모리

- 동적 할당

  - 실행 중 메모리 할당

  - 동적할당 메모리는 Heap영역에 할당

 

Heap 영역의 특징

- Heap 영역은 자료형의 개념이 없음. byte단위로 정보를 처리한다.

- Heap 영역은 일반적인 Stack과 Data영역보다 넓은 메모리 영역을 가진다.

- 할당된 메모리의 시작주소를 malloc함수를 호출한 지역으로 반환한다.

- 시작주소만 반환 되기 때문에 Stack영역에서 사용하려면 해당 자료형 주소로 형변환 해야한다.

- Heap영역에 할당된 메모리는 자동으로 해제되지 않는다.

 

malloc 함수

- Heap 영역에 동적으로 공간을 할당 해주는 함수

- 필요 헤더 : <stdlib.h>

- (void*)malloc(size)

  ※ 할당 하고싶은 자료형을 byte 단위로 인자값을 보낸 후 할당된 메모리의 시작주소를 해당 자료형으로 형변환 후 사용.

  ※ 할당에 성공하면 해당 주소값을 반환하고, 실패하면 NULL을 반환한다.

  ※ int* a = (int*)malloc(sizeof(int));

 

free 함수

- Heap영역에 할당된 공간을 해제하는 함수

- 필요 헤더 : <stdlib.h>

- free(void*)

  ※ Heap 영역에 할당된 메모리는 자동으로 해제되지 않는다.

  ※ 해제를 한다고 해당 포인터 변수의 값이 없어지는것이 아니다. (메모리 사용 권한만 취득, 반납하는 개념)

  ※ 해제를 한 후 해당 포인터 변수는 NULL로 밀어준다.

  ※ free(ptr);

     ptr = NULL;

반응형

'Stack > C' 카테고리의 다른 글

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 구조체, 구조체 포인터  (0) 2021.08.22
C 포인터, 배열  (0) 2021.08.22
반응형

포인터

- 포인터 : 주소값을 저장하기 위한 변수

- 포인터 size : 4byte(32bit), 8byte(64bit)

- 포인터형 : (자료형)* 변수명

   ※ 포인터형도 자료형 범주에 포함시키기도 한다.

   ※ *연산자의 위치는 상관없다.

   ※ 포인터에 형이 없으면 *연산을 통한 메모리 접근은 불가능하다.

- 포인터 변수의 자료형은 해당 주소의 자료형과 동일해야 한다.

- 포인터의 형이 존재하는 이유는 메모리 공간을 참조하는 기준이 된다.

  ※ int* ptr : 해당 변수에 저장되어있는 주소값으로 가서 sizeof(int)(4byte)를 읽어들여 정수로 해석한다.

- NULL 포인터 : 아무데도 가리키지 않는다.

   ※ int* ptr = 0 or NULL

 

#include<stdio.h>

void main()
{
    int a = 10;
    int* ptr = &a;
    
    //ptr은 주소값을 가지므로 ptr == &a
    printf("var a address : %p, pointer ptr value : %d", ptr, *ptr);
}

 


배열

- 배열의 이름은 포인터이다.

  ※ 단, 값을 바꿀 수 없는 '상수 형태의 포인터'이다.

  ※ 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 *연산이 가능하다.

  포인터 변수 배열 이름
이름 유무
저장하는 값 주소 값 주소 값
주소 값 변경 가능한가? 가능(변수) 불가능(상수)

 

- 포인터 변수를 배열로 사용하기

#include<stdio.h>
#define MAX 3

void main()
{
    //포인터에 배열의 이름을 넣어 배열처럼 사용 가능
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        ptr[i] += 1;
        printf("%d", ptr[i]);
    }
    
    //결과 1 2 3
}

 

 

- 배열의 다른 표현방법

#include<stdio.h>
#define MAX 3

void main()
{
    int arr[3] = {0, 1, 2};
    int* ptr = arr or &arr[0];

    for(int i = 0; i < MAX; i++)
    {
        *(ptr + i) += 1;
        printf("%d", *(ptr + i));
    }
    
    //결과 1 2 3
}

  ※ int형 포인터를 대상으로 1을 증가시키면 4가 증가한다.

  ※ int 형 포인터를 대상으로 +-n => +-n * sizeof(int)

  ※ 결론 arr[i] == *(arr + i)

 

- 활용

#include<stdio.h>

//배열도 포인터이기 때문에 인수를 char str[]로 사용해도 무방하다.
void ConvertLowercase(char* str)
{
    for (int i = 0; str[i] != NULL; i++)
        if (str[i] >= 'A' && str[i] <= 'Z')
            str[i] += 32;
}

void main()
{
    char arr[3] = "AB";
    ConvertLowercase(arr);
    printf("%s", arr);
    
    //결과 ab
}

  ※ char 배열의 마지막은 NULL(\0)로 채워지므로 for문 조건문에 NULL을 사용할 수 있다.

 


포인터 배열

- 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열을 가리킨다.

#include<stdio.h>
#define MAX 3

void main()
{
    int a = 10, b = 20, c = 30;
    int* arr[3] = {&a, &b, &c};

    for(int i = 0; i < MAX; i++)
        printf("%d", *arr[i]);
    
    //결과 10 20 30
}
반응형

'Stack > C' 카테고리의 다른 글

C 중간 활용 : 학생 관리 시스템 만들기  (0) 2021.08.24
C 파일 입출력  (0) 2021.08.24
C 구조체, 구조체 포인터  (0) 2021.08.22
C 동적할당  (0) 2021.08.22

+ Recent posts