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 ; 이런식으로 쓴 거랑 같음
'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 |