배열 동적 생성

황준하·2022년 2월 24일
0

calloc 함수를 이용해 배열을 동적 생성해보자.


#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)  // scanf에 대한 warning 무시

int main() {
	int i;
	int *a;
	int na;

	scanf("%d", &na);
	a = calloc(na, sizeof(int));  // 메모리 동적 할당: int의 size만큼의 na 개가 메모리 할당

	if (a == NULL)  // 메모리 할당이 안되었을 시
		printf("ERROR");
	else {
		for (int i = 0; i < na; i++)  // 할당받은 메모리 만큼 값을 넣자.
			scanf("%d", &a[i]);

		for (int i = 0; i < na; i++)  // 잘 들어 갔나 확인
			printf("%d ", a[i]);

		free(a);  // 동적 할당 해제
	}

	return 0;
}
입력>>> 5 
        1 2 3 4 5
출력>>>
        1 2 3 4 5
  • calloc 함수

    • 헤더: #include <stdlib.h> 필요
    • 형식: void *calloc(size_t nmemb, size_t size);
    • 크기가 size인 자료가 nmemb개만큼 들어갈 메모리 할당.
    • 반환: 메모리 할당 성공시 할당 영역의 첫 번째 포인터 반환, 실패 시 NULL 반환
      • NULL은 값이 없음을 의미하며 메모리가 할당되지 않음.
  • free 함수

    • 헤더는 calloc과 같음.
    • 형식: void free(void *ptr)
    • ptr이 가리키는 메모리를 해제
    • 반환 값은 없으며, 이미 해제된 영역이면 아무것도 하지 않음.
  • int형 포인터에 동적 할당을 하면 어떻게 int형 배열이 될까?

    • calloc 함수가 확보하는 것은 특정한 자료형의 객체가 아니라 단순히 메모리 영역이기 때문
    • 또, 배열은 주소가 연속적으로 이어지기 때문에 calloc으로 첫 주소 포인터를 반환받아서 이를 +- 연산을 하면 배열처럼 접근 가능
      • ex) *(a+2) = &a[2];
  • 포인터

    • 객체(변수) 또는 함수를 가리키는 것
      • ex) int *p; = int형 객체를 가리키는 포인터
    • 포인터 p가 객체 n을 가리키게 하기 위해 n의 주소를 대입해야 함.
      • ex) p = &n;
    • p가 가리키는 객체의 값에 접근할 때는 *(간접 연산자)를 이용함
      • ex) *p=999; : p가 가리키고 있는 곳(n)에 999를 대입하라.

0개의 댓글