[C언어] 동적 메모리 할당

2021. 4. 8. 17:23·Major/C&C++
728x90

1. 동적 메모리 할당

- 일반적인 배열은 크기가 고정되어있다.

- 이러한 고정된 크기 때문에 배열이 남을 수도, 부족할 수도 있다. 

- 일반적인 배열의 단점을 보완한 것이 '동적 메모리 할당' 이다.

 

 

1) 의미 : 메모리를 운영체제로부터 할당받아서 사용하고, 사용이 끝나면 반납하는 기능

- 동적 메모리가 할당되는 공간을 히프(heap)라고 한다. 

* 히프는 운영체제가 사용되지 않는 메모리 공간을 모아놓은 곳이다.

 

2) 선언 방법

int *p;
p = (int *)malloc(sizeof(int)); //동적 메모리 할당
*p = 1000; //동적 메모리 사용
free(p); //동적 메모리 반납

- malloc() 함수는 size 바이트 만큼 메모리 블록을 할당한다. 따라서 sizeof(int) = 4byte 만큼의 크기를 할당하게 된다.

  이 함수는 동적 메모리 블럭의 시작 주소를 반환하는데,  위 코드에서 반환되는 주소의 타입은 int * 이다. 

  만약 메모리 확보가 불가능하면 NULL을 함수의 반환 값으로 반환한다.

- 동적메모리는 포인터로만 사용 할 수 있다.

- free() 함수는 할당된 메모리 블록을 운영체제에게 반환한다. malloc() 함수가 반환했던 포인터 값을 잊어버리면 동적 메로리를 반환할 수 없다.(반환을 하지 않는다고 해서 컴파일 에러가 나진 않는다)

 

ex) 정수 10을 저장할 수 있는 동적메모리 할당하기

 

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

#define SIZE 10

int main() {
	int* p; //배열의 이름은 포인터를 의미합
	p = (int*)malloc(SIZE * sizeof(int)); //SIZE만큼 배열의 메모리를 할당
	if (p == NULL) {
		fprintf(stderr, "메모리가 부족하여 할당할 수 없습니다\n");
		exit(1);
	}
	for (int i = 0; i < SIZE; i++) {
		p[i] = i;
	}
	for (int i = 0; i < SIZE; i++) {
		printf("%d ", p[i]);
	}
	free(p);
	return 0;
}

 

2. 구조체와 포인터

- 포인터를 통하여 구조체의 멤버에 접근하는 표기법은 '->' 이다.

- ps가 구조체를 가르키는 포인터라고 할 때, (*ps).i 보다 ps->i라고 쓰는 것이 편리.

 

ex) 구조체로 동적메모리 할당

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct studentTag {
	char name[10];
	int age;
	double gpa;
}student;

int main() {
	student* s; //구조체 포인터 선언
	s = (student*)malloc(sizeof(student));

	strcpy(s->name, "beni");  
	//s->name = "beni" 는 에러남
	s->age = 20; //(*s).age = 20; 과 같다.
	free(s);
	return 0;

}

 

 

 

문제 : 다음 코드의 오류를 모두 찾아라!

* c언어로 쉽게 풀어쓴 자료구조 ch3 quiz 문제

int main(void){
   double *p1;
   p1 = (int *)malloc(double);
   p1 = 23.92;
}

 

답 : 

ⓐ p1을 double 형으로 선언했는데 int *형식으로 반환이 불가하다 

* 할당하는 메모리랑 반환하는 메모리랑 같아야 된다고 생각하면 이해하기 쉬움

(앞에괄호안 데이터타입과 malloc안 괄호 데이터타입 같아야됨)

 

ⓑ p1은 포인터변수이기 때문에 값을 집어넣을 땐 p1[1] = 23.92; 로 가능

위 코드처럼 작성하면 포인터변수에 데이터 값을 집어넣은 것이기 때문에 컴파일 에러가난다.

저 코드는 배열 arr[]를 선언하고 arr = 1 ; 이런식으로 쓴 거랑 같음

 

 

 

 

 

728x90
저작자표시 비영리 (새창열림)

'Major > C&C++' 카테고리의 다른 글

[C++] 명품 C++ Programming 1장 연습문제(이론)  (0) 2021.05.03
[C언어] 스택과 큐 구현해보기  (0) 2021.04.17
[C언어] 포인터로 두 변수의 값 서로 바꾸기  (0) 2021.04.08
[C언어] 구조체  (0) 2021.04.08
[C언어] 문자/문자열 입력받기(여러개 입력받기)  (8) 2021.04.04
'Major/C&C++' 카테고리의 다른 글
  • [C++] 명품 C++ Programming 1장 연습문제(이론)
  • [C언어] 스택과 큐 구현해보기
  • [C언어] 포인터로 두 변수의 값 서로 바꾸기
  • [C언어] 구조체
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (254)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (66)
        • Article (11)
        • Study (36)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    파일처리
    lisp
    백준
    리팩토링
    프로그래머스
    react
    자료구조
    Algorithm
    C++
    데브코스
  • hELLO· Designed By정상우.v4.10.2
BeNI
[C언어] 동적 메모리 할당
상단으로

티스토리툴바