ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•
๋ ‰ํ† ํ”ผ์•„ ์ •ํ˜œ๊ฒฝ ๊ฐ•์‚ฌ๋‹˜์˜ 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`๋ฅผ ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ? ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๊ณ  ๋™์ ํ• ๋‹น ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ณต์‚ฌํ•œ ๊ณณ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•

'๐Ÿ™‹โ€โ™‚๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > 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
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€