💻Computer Science/📕개발 언어 (Language)

[C][Ch.5] C언어 기초4

Written by Donghak Park

C언어 기초4

포인터와 배열

배열의 이름은 값을 변경할 수 없는 상수 포인터입니다.

즉 배열의 이름은 배열의 주소값을 저장하고 있는 포인터입니다.

따라서 아래와 같은 응용이 가능합니다.

int arr[3] = {10, 20, 30, 40, 50};
printf("%d %d %d %d %d\n", arr[0], arr[1], arr[2]);
printf("%d %d %d %d %d\n", *(arr +0), *(arr + 1), *(arr + 2), *(arr + 3), *(arr + 4));
// 위의 두 printf문은 같은 결과를 출력하게 됩니다. 즉 배열의 이름을 활용한 주솟값 연산이 가능하다는 것입니다.

포인터 배열

포인터 배열은 배열의 요소로 포인터 변수를 가진다.

int arr_len;
int num1 = 10;
int num2 = 20;
int num3 = 30;

int* arr[3] = {&num1, &num2, &nnum3};

그렇다면 포인터 배열과 배열 포인터는 어떻게 구별하는가?

()에 따라서 그 의미가 완전히 다르게 해석된다.

int* ptrArr[3]; //포인터 배열
int (*ptrArr)[3]; // 배열 포인터

메모리 구조

프로그래밍을 하는데 있어서 내부 구조를 이해하는 것은 중요하다. 특히 C와 같이 하드웨어와 밀접한 작업을 할 수 있는 언어는 더욱 중요하다.

일단 프로그램이 실행되기 위해서는 프로그램이 메모리(주로 우리가 말하는 DRAM)에 로드되어야 한다. 또한 이러한 프로그램에서 사용되는 다양한 데이터들도 메모리에 저장되어야 한다.

따라서 컴퓨터 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있고 다음과 같다.

  • 코드(Code) 영역
    • 코드영역에는 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 부릅니다. 여기서 CPU가 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
  • 데이터(Data) 영역
    • 데이터영역에는 프로그램의 전역 변수와 정적 변수가 저장됩니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소명합니다.
  • 스택(Stack) 영역
    • 스택영역은 함수의 호출과 관게되는 지역 변수와 매개 변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 이러한 함수의 정보를 스택 프레임이라고 부릅니다. 스택은 말 그대로 스택구조로 되어 있으며 푸시와 팝을 통해 데이터를 인출 삽입합니다.
  • 힙(Heap) 영역
    • 힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역입니다. 사용자가 동적할당을 하게 되면 이 부분에 할당되게 됩니다.
    •                                                           image

메모리 동적 할당

메모리 동적 할당 (Memory Dynamic Allocation)

  • 데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정됩니다.
  • 하지만 힙 영역의 크기는 런 타임에 할당되며 사용자가 제어할 수 있습니다.
  • 이렇게 힙 영역에 메모리를 할당받아 사용하는 것을 메모리의 동적 할당이라고 합니다.
  • 여기서 동적이라는 뜻은 프로그램이 실행중인 상황에서 메모리를 할당하기 때문에 즉 런타임시에 메모리를 할당 받을 수 있기 때문에 사용됩니다.

malloc()함수

#include <stdlib.h>

void *malloc(size_f size);

위와 같은 함수를 통해서 메모리를 할당 받을 수 있습니다. 이때 아래와 같은 조건에 따라서 메모리를 할당 받으면 됩니다.

  • 메모리의 크기는 바이트 단위 (보통 원하는 사이즈를 위해서 sizeof(int) * 4와 같은 형식으로 사용합니다.)
  • 할당 할 수 있는 적당한 공간이 없으면 널 포인터를 반환합니다.

free 함수

free() 함수는 할당 받은 메모리 공간을 운영체제로 반환하는 함수입니다. 많은 공간을 동적으로 할당하고 해제해주지 않으면 메모리 공간이 부족해지는 현상이 발생하고 이를 메모리 누수 (Memory Leak)라고 합니다.

free()함수는 해재하고자하는 메모리의 포인터를 인수로 주어 사용합니다. 아래 예제를 보면 좀 더 쉽게 이해 할 수 있습니다.

#include <stdlib.h>

ptr_arr = (int*) malloc(arr_len * sizeof(innt));

if (ptr_arr == NULL){ //NULL 포인터를 반환한 경우 : 실패시
    exit(1);
}

// ~~~~

free(ptr_arr);

calloc() 함수

calloc() 함수는 malloc() 함수와 마찬가지이지만 아래와 같은 차이가 있다.

  • 메모리를 할당 받은 후 모든 값을 0으로 초기화해준다.
#include <stdlib.h>
void *calloc(size_t s, size_t size);

realloc() 함수

realloc() 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용합니다.

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

Reference

'💻Computer Science > 📕개발 언어 (Language)' 카테고리의 다른 글

[C][Ch.7] C언어 기초6  (0) 2021.09.10
[C][Ch.6] C언어 기초5  (0) 2021.09.09
[C][Ch.4] C언어 기초3  (2) 2021.08.03
[C][Ch.3] C언어 기초2  (0) 2021.07.29
[C][Ch.2] C언어 기초  (2) 2021.07.22