ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ ํ ํผ์ ์ ํ๊ฒฝ ๊ฐ์ฌ๋์ Secure & Generic C ๊ฐ์๋ฅผ ๋ฃ๊ณ , ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
ํด๋น ๋ด์ฉ์ ์ ์๊ถ์ ์ ํ๊ฒฝ ๊ฐ์ฌ๋์๊ฒ ์์ต๋๋ค.
๋์ ํ ๋น
user level์์ ์ฌ์ฉํ ์ ์๋ ๋์ ํ ๋น์ผ๋ก๋ ๋ํ์ ์ผ๋ก `malloc`๊ณผ `calloc`์ด ์๋ค. `malloc`์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น ํ ๋ณ๋์ ์ด๊ธฐํ๊ฐ ์์ด ์ฐ๋ ๊ธฐ ๊ฐ์ ๊ฐ๋๋ค. ์ด์ ๋ฌ๋ฆฌ `calloc`์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น ํ์ ํ ๋น๋ ๊ณต๊ฐ์ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
malloc
malloc์ parameter๋ก ํ ๋นํ๊ณ ์ ํ๋ ํฌ๊ธฐ๋ฅผ ๋ฐ๋๋ค. ๋ณดํต์ ํ ๋นํ๊ณ ์ ํ๋ ๊ณต๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ `sizeof(๋ฐ์ดํฐ ํ์ )` ์ฐ์ฐ์ ํตํด ํ ๋นํ๋ค. ๋ง์ฝ malloc์ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๊ฐ 5์ธ int 1์ฐจ์ ๋ฐฐ์ด์ ํ ๋นํ๋ค๋ฉด `int * p = (int *)malloc(5 * sizeof(int))`์ ๊ฐ์ด ์ ์ธํ ์ ์๋ค.
calloc
calloc์ malloc๊ณผ ๋ฌ๋ฆฌ parameter๊ฐ `(ํ ๋นํ๊ณ ์ ํ๋ ๊ฐ์, ๋ฐ์ดํฐ ํ์ ์ ํฌ๊ธฐ)`๋ก ๋๋๋ค. return type์ malloc๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก `(void *)`์ด๋ค. ์์ ์์์ ๋์ผํ ์กฐ๊ฑด์ calloc์ผ๋ก ํํํ๋ค๋ฉด, `int * pointer = (int *)calloc(5, sizeof(int))`๋ก ์ ์ธํ ์ ์๋ค.
ํฌ์ธํฐ์ ํ์ฉ
๋์ ํ ๋น์ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ํฌ์ธํฐ์ ์ดํด๊ฐ ํ์ํ๋ค. `&`, `*`๊ฐ ์ด๋ค์์ผ๋ก ๋์ํ๋์ง์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค. ์๋ฅผ ๋ค์ด 1์ฐจ์ ๋ฐฐ์ด์ ๋์ ํ ๋นํ๋ฉด ์ `int *` ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์์ ๋ฐ๋๋ค. ์ด๋ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ์ํด 1์ฐจ์ ํฌ์ธํฐ๋ก ๋ฐ๋๋ค.
์ฆ, `int a = 10`์ด ์์ ๋ `&a`์ ์ฃผ์๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ `int * b`์ ๊ฐ์ด ์ฑ๊ธ ํฌ์ธํฐ๊ฐ ํ์ํ๋ค. ๋ง์ฝ `b`๋ฅผ ๋ฐ๊ธฐ ์ํ parameter๋ฅผ ์ ์ธํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํ์ฌ์ผํ ๊น? ๋ง์ฐฌ ๊ฐ์ง๋ก `&b`์ ์ฃผ์๋ฅผ ๋ฐ์์ผ ํ๊ธฐ์ `int **c`์ ๊ฐ์ ๋๋ธ ํฌ์ธํฐ๊ฐ ํ์ํ๋ค. ์ด๋ `c → b → a`์ ๊ฐ์ด ํฌ์ธํ ํ๊ฒ ๋๋ค. ์ด ๊ฐ๋ ์ ๋ฐํ์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ๋์ ํ ๋น ํ๋ฏ๋ก ์ถฉ๋ถํ ์ดํดํ์ฌ์ผ ํ๋ค.
2์ฐจ์ ๋ฐฐ์ด ๋์ ํ ๋น
#include<stdio.h>
#include<stdlib.h>
#pragma warring (disalbe:4996)
int** alloc(int row, int col);
void input(int** p, int row, int col);
void output(int** p, int row, int col);
void clear(int** p, int row);
int main()
{
int** ip;
int col, row;
printf("row : ");
scanf("%d", &row);
printf("column : ");
scanf("%d", &col);
ip = alloc(row, col);
if (ip == NULL)
return 1;
input(ip, row, col);
output(ip, row, col);
clear(ip, row);
return 0;
}
int** alloc(int row, int col) {
int** arr = NULL;
/*
* int *๋ฅผ ๋ด์ ์ ์๋ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น.
* ๋ฐ๋ผ์ row pointer๋ ๋๋ธํฌ์ธํฐ
* [ int * ][int * ] ... [int *] -->
* ๊ฐ ์ฃผ์์ col์ ํ ๋นํจ
* ์ฐ์๋ int *๋ฅผ ๊ฐ์ง ๊ณต๊ฐ์ ์ฃผ์๋ int **์ด ๋จ.
*/
arr = (int**)malloc(row * sizeof(int*));
if (arr == NULL) {
return NULL;
}
for (int i = 0; i < row; i++) {
arr[i] = (int*)malloc(col * sizeof(int));
if (arr[i] == NULL) {
clear(arr, i);
free(arr);
return NULL;
}
}
return arr;
}
void input(int** p, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
p[i][j] = i + j;
}
}
}
void output(int** p, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", p[i][j]);
}
printf("\n");
}
}
void clear(int** p, int row) {
if (p == NULL)
return;
for (int i = 0; i < row; i++) {
free(p[i]);
}
free(p);
}
2์ฐจ์ ๋ฐฐ์ด์ ์ ์ธํ๊ธฐ ์ํด์๋ `int *`์ ๊ณต๊ฐ์ ์ฐ์์ผ๋ก ํ ๋นํ์ฌ์ผ ํ๋ค. ๋ํ `int *`๋ก ์ฐ์ ํ ๋น๋ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ๊ธฐ ์ํ ๋ณ์๋ ์์์ ์ค๋ช ํ์๋ฏ์ด `int **`์ด ๋๋ค.
- row ๋งํผ์ ํน์ ๋ฐ์ดํฐ ํ์ ํฌ์ธํฐ ๊ณต๊ฐ์ ์ฐ์ ํ ๋น
- ๊ฐ ๋ฐ์ดํฐ ํ์ ํฌ์ธํฐ์ col ๋งํผ์ ๋ฐ์ดํฐ ํ์ ๊ณต๊ฐ์ ์ฐ์ ํ ๋น
์ฆ, ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฐ์๋ row๋งํผ์ ํ ๋น ๋ ๊ณต๊ฐ์ col ๋งํผ ํ ๋นํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฐ ์์ ์ ํ๋ฒ ๋ ํ๊ฒ ๋๋ฉด 3์ฐจ์ ๋ฐฐ์ด์ด ๋ ๊ฒ์ด๊ณ , ํ๋ฒ ๋ ํ๊ฒ ๋๋ฉด 4์ฐจ์ ๋ฐฐ์ด์ด ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์
row ํฌ๊ธฐ ๋งํผ ํ ๋นํ ๊ณต๊ฐ์ ๋จผ์ ํด์ ํ๊ฒ ๋๋ฉด, col ํฌ๊ธฐ ๋งํผ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ ๋ ๋ ๊น์ง ํด์ ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ํด์ ๋ ํ ๋น์ ์ญ์์ผ๋ก ์งํํ์ฌ์ผ ํ๋ค.
shallow copy vs deep copy
void copy(int** p1, int** p2, int row, int col) {
if (p1 == NULL || p2 == NULL)
return;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
p1[i][j] = p2[i][j];
}
}
}
๋ค์ฐจ์ ๋ฐฐ์ด ๋๋ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ๋์ ํ ๋น์ ํ๊ฒ ๋๋ฉด `shallow copy`์ `deep copy`๋ฅผ ์ดํดํ์ฌ์ผ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง์ ์ ์๋ค. ์๋ฅผ ๋ค์ด 2์ฐจ์ ๋ฐฐ์ด์ ๋์ ํ ๋นํ arr1, arr2๊ฐ ์๋ค๊ณ ํ๋ฉด arr2์ ๊ฐ์ arr1๋ก ๋ณต์ฌํ๊ธฐ ์ํด `arr1 = arr2`๋ฅผ ํ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ ๊น? ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝ๋๊ณ ๋์ ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ง ์๋ ์ํ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๊ฐ์ ๋ณต์ฌํ์ฌ ๋ณต์ฌํ ๊ณณ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๋ ํด์ ํ ์ ์๋๋ก ํ์ฌ์ผ ํ๋ค.
'๐โโ๏ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C: Storage class specifier (0) | 2020.11.27 |
---|---|
C: fork() (0) | 2020.11.25 |
C: Generic Coding (0) | 2020.11.18 |
C: ๋ค์ํ ํฌ์ธํฐ (0) | 2020.11.17 |
C: ์ ์์ ๋ฒ์ (0) | 2020.11.16 |