[C언어-막코딩] 21장 포인트 배열변수 할당과 해제

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@codingman·
0.000 HBD
[C언어-막코딩] 21장 포인트 배열변수 할당과 해제
# [C언어-막코딩] 21장 포인트 배열변수 할당과 해제
-----
- 참고 :[ [C언어-막코딩] 19장 포인트 변수 메모리 할당과 해제](https://steemit.com/kr-dev/@codingman/c-19--1555373245998)
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php

-----
오늘은 지난시간에 포인트 단일 변수 메모리 할당과 해제를 다룬 내용에서 확장 된 내용으로 포인트 배열 변수의 할당과 해제에 대해서 간단히 설명을 하겠습니다. 추가로 C++에서 포인트 변수 사용을 어떻게 하는지만 간단히 살펴보도록 하겠습니다.

## 1. 포인트 배열 변수 할당과 해제
-----
지난시간에 배운 포인트 할당 malloc()과 해제 free() 함수의 사용은 다은과 같습니다.

```
int *p=(int*)malloc(sizeof(int));	
int *arr_p=(int*)malloc(sizeof(int)*3);	

명령문;

free(p);
free(arr_p);
```
단일 변수와 1차배열 변수의 경우는 malloc()함수를 위처럼 할당하고 해제는 free()함수에서 p와 arr_p로 포인트 주소지를 인자로 넘겨주어 해제가 이루어 집니다. 여기까지는 간단합니다. 그런데 2차배열 3차배열에서는 좀 복잡한 코딩을 해야 합니다.

포인트 2차배열 변수의 경우 할당은 다음과 같습니다.
```
//할당	
arr_p=(int**)malloc(sizeof(int)*3);	
for(i=0;i<3;i++){
	arr_p[i]=(int*)malloc(sizeof(int)*2);
}
```
arr_p[3][2] 배열 변수를 만든다면 3행 2열이기 때문에 먼저 3행을 malloc()함수로 만듭니다. 이렇게 만들었다면 2열을 만들기 위해서 각행 별로 2열씩 추가로 만들어야 합니다 .그래서 for문을 이용해서 i행별로 2열을 malloc()함수로 만듭니다.

여기까지는 어렵지 않죠.

arr_p[3][2] 배열을 해제하기 위해서는 역순으로 2열들을 각각 해제 한 뒤에 마지막 3행을 해제해야 합니다.

```
//해제
for(i=0;i<3;i++){				
	free(arr_p[i]);		
}	
free(arr_p);
```
위처럼 i행 별로 각 열들을 free()함수로 해제 한 뒤에 마지막 free()함수로 행배열을 해제함으로 2차배열이 해제 됩니다.

위 과정을 더 쉽게 설명하자면 다음과 같습니다.

### 할당의 경우 :
-----
<center>
![a1.jpg](https://cdn.steemitimages.com/DQmX5YB8FxvtfHn2W5z8Avu5qw5xZahFxM47F7j68hBp3t9/a1.jpg)
</center>

2차 배열을 만든다면 먼저 1차배열[3]을 만듭니다. 그 1차 배열에서 각 배열 공간마다 1차 배열[2]을 다시 만듭니다. 이렇게 해서 2차 배열[3][2]이 완성됩니다.

### 해제의 경우 :
-----
<center>
![a2.jpg](https://cdn.steemitimages.com/DQmPAmfQH7WfkjsJ1Mg5GpsRg4xUoTFtHdbiwn8ui9Hi6Pd/a2.jpg)
</center>
열의 각 1차배열[2]을 해제 한 뒤에 마지막 1차 배열[3]을 해제 함으로서 2차 배열[3][2]을 해제 하게 됩니다.

이제 코딩해서 실행을 해 봐야 겠죠.

## 2. 코딩
-----
**[소스]**
```
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
	
	int i,j;
	int cnt=1;
	int **arr_p;
	
	//할당	
	arr_p=(int**)malloc(sizeof(int)*3);	
	for(i=0;i<3;i++){
		arr_p[i]=(int*)malloc(sizeof(int)*2);
	}
	
	//처리 
	for(i=0;i<3;i++){		
		for(j=0;j<2;j++){
			arr_p[i][j]=cnt++;
		}
	}

	//출력 
	for(i=0;i<3;i++){		
		for(j=0;j<2;j++){
			printf("*arr_p주소[%d][%d] : %x  값 : %d \n",i,j,&arr_p[i][j],arr_p[i][j]);
		}
	}
	
	//해제 
	for(i=0;i<3;i++){				
		free(arr_p[i]);		
	}	
	free(arr_p);   
   
	return 0;
}	
```
**[결과]**
![a3.jpg](https://cdn.steemitimages.com/DQmUgTt5jZu1YCDuKuYikbA18ZqyvjeiJZc1qfqrKEYZHS2/a3.jpg)

## 3. C++에서 할당과 해제
-----
번외 내용으로 C++에서 포인트 변수 할당과 해제를 간단히 소개 합니다.

**[할당]**
```
int *p = new int[3];
```
C언어보다 무지 간단하죠. new라는 키워드로 간단히 배열을 생성합니다.

**[해제]**
```
delete [] p;
```
delete 키워드로 삭제가 됩니다. C++ 자체가 C언어보다 더 간결한 코딩을 합니다. 뭔가 복잡하게 디테일 적으로 코딩해야 하는 부분들이 생략되고 간단한 코딩이 이루어져서 C언어를 처음 힘들게 공부한 분들은 C++로 넘어갈 때 무지 편하게 습득하게 됩니다. 물론 C언어에 없는 개념인 클래스 개념에 들어가면 좀 복잡해지지만 그래도 편하게 언어를 습득 할 수 있습니다.

제대로 할당 해제가 되는지 실행해 봅시다.

**[소스]**
```
#include <iostream>
using namespace std;


int main(int argc, char** argv) {
	int *p = new int[3]; //할당 

	//처리		
	for(int i=0;i<3;i++){
		p[i]=i;
	}
	
	//출력 
	for(int i=0;i<3;i++){
		cout<<p[i]<<endl;
	}
	
	//해제 
	delete [] p;
}
```
출력도 cout명령으로 printf()문의 복잡한 서식문자 코딩이 사라지고 직접적으로 C++에서 대입합니다.
**[결과]**
![a12.jpg](https://cdn.steemitimages.com/DQmYenCLgc8EY9GmdEppuCeVUUf4FgyXC1tBGztYxS2bmy4/a12.jpg)


## 마무리
-----
포인트 배열변수의 할당화 해제를 해 보았습니다. 그리고 번외로 C++의 포인트변수의 할당과 해제까지 보여드렸습니다.  여러분들은  위 코딩을 실행 해 본뒤 포인트 배열변수에서 C언어의 표현을 위 C++의 코딩과 접목하여 수정해 보세요. 제대로 이해했는지 수정하셔서 결과를 확인해 보세요.

---

#####  <sub> **Sponsored ( Powered by [dclick](https://www.dclick.io) )** </sub>
[![dclick-imagead](https://s3.ap-northeast-2.amazonaws.com/dclick/image/msowner2/1555565468647.jpg)](https://api.dclick.io/v1/c?x=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiY29kaW5nbWFuIiwicyI6ImMtMjEtLTE1NTU1NDY3Njc2MTIiLCJhIjpbImktMjE2Il0sInVybCI6Imh0dHA6Ly9iaXQubHkvbW9vblNURUVNX0tSMiIsImlhdCI6MTU1NTYzMjYyOSwiZXhwIjoxODcwOTkyNjI5fQ.qKJsZyyu9l3GJeq5KjHr4kfkyxfw_KJkaUTG6UxPugs)
👍 , , , , , , , , , , , , , , , , , , , , ,