ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ ํ ํผ์ ์ ํ๊ฒฝ ๊ฐ์ฌ๋์ Secure & Generic C ๊ฐ์๋ฅผ ๋ฃ๊ณ , ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
ํด๋น ๋ด์ฉ์ ์ ์๊ถ์ ์ ํ๊ฒฝ ๊ฐ์ฌ๋์๊ฒ ์์ต๋๋ค.
1์ฐจ์ ํฌ์ธํฐ
int *p, *pp;
int arr[5] = {10, 20, 30, 40 ,50}, num = 10;
p = arr;
//p๋ ๋ฐฐ์ด๋ช
์ ๋ฐ์ผ๋ฏ๋ก, p[1]๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉ๊ฐ๋ฅ. *(p++)๋ ๊ฐ๋ฅ.
// index 3์ ์ฃผ์๋ &arr[2], &p[2], (p + 2), (arr + 2), &*&*(arr + 2)
pp = #
1์ฐจ์ ํฌ์ธํฐ๋ ํน์ ํ ์ฃผ์๋ฅผ ํฌ์ธํธ ํ ์ ์๋ค. `๋ฐฐ์ด ๋ช `, `ํจ์ ๋ช `, `&๋ณ์๋ช `์ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค. ๋ฐ๋ผ์ ์์ ์์ ์ฝ๋์ ๊ฐ์ด ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๋ฐฐ์ด๋ช ์ ๋์ ์ฐ์ฐํ๊ฒ ๋๋ฉด ํฌ์ธํฐ p๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
#include <stdio.h>
#include <string.h>
int main()
{
char *p = "Develop" ;
// Text Area์ ์๋ literal ์์๋ฅผ Point.
// Text Area์ literal ์์๋ const char *์ด๋ค. c++์์๋ p์ const๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ์๋ฌ..
char str[20] = "Develop";
// literal ์์๋ฅผ str[20]์ผ๋ก ๋ณต์ฌ
p[0] = 'K'; // RTE
strcpy(p, "Call"); // RTE
str = "Success"; // ๋ฐฐ์ด๋ช
์ ์์์ด๋ฏ๋ก Compile error.
return 0;
}
์ด๋ค ๊ฒ์ ํฌ์ธํธ ํ๋๊ฐ์ ๋ฐ๋ผ ์๋ฌ์ ์ง๋ฉดํ ์ ๋ ์๋ค. ์์ ์์ ์ฝ๋์ ๊ฐ์ด, `p`๋ ๋ฌธ์์ด์ ์์ ์ฃผ์๋ฅผ ํฌ์ธํธ ํ๊ณ , `str`์ ์์๋ฅผ ๋ณต์ฌํ๋ค. `"Develop"`๊ณผ ๊ฐ์ ๋ฌธ์์ด์ ์์๋ก์จ `Text Area`์ ํ ๋น๋๊ฒ ๋๋ค. ๋ฐ๋ผ์ p๋ฅผ ํตํด ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค๋ฉด, ์ค๋ฅ์ ์ง๋ฉดํ๋ค. ์ด์ ๋ฌ๋ฆฌ `str`์ ๋ณต์ฌํ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, `str` ์์ฒด๋ ์ฃผ์๋ฅผ ์๋ฏธ(์์)ํ๋ฏ๋ก ๋ฌธ์์ด์ ํ ๋นํ ์ ์๋ค.
๋ค์ฐจ์ ํฌ์ธํฐ
int test;
int *p1
int **p2;
int ***p3;
p1 = &a;
p2 = &p1;
p3 = &p2;
์ด์ ๊ฐ์ ์ฝ๋๊ฐ ์์ ๋ `p3→p2→p1→test`์ ๊ฐ์ด ํฌ์ธํ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ test์ ์ฃผ์๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ `* p1`๊ฐ ํ์ํ๊ณ `p1`์ ์ฃผ์๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ `**p2`๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. ์ฆ, ํฌ์ธํฐ๊ฐ ์๋ ์ผ๋ฐ ๋ณ์์ ์ฃผ์๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ `* ptr`์ด ํ์ํ๊ณ ํฌ์ธํฐ ๋ณ์๋ฅผ ๋ฐ๊ธฐ ์ํด์๋ ๊ธฐ์กด์ `*` ๊ฐ์ + 1์ ํด์ฃผ๋ฉด ๋๋ค.
๋ฐฐ์ด์ ํฌ์ธํฐ ํํ
C๋ ์ปดํ์ผ ๋ ๋ `a[3]`๊ณผ ๊ฐ์ ํ์ ์ `*(a + 3)`์ผ๋ก ํํํ๋ค. ์ฆ, ๋ฐฐ์ด์ ํฌ์ธํฐ ํํ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
a[i] //*(a + i)
a[i][j] //*(*a[i + 1] + j)
a[i][j][k] // *(*(*a[i + 1] + j) + k)
&a[i] //(a + i)
&a[i][j] //(*a[i + 1] + j)
&a[i][j][k] //(*(*a[i + 1] + j) + k)
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐฐ์ด์ ํฌ์ธํฐ๋ก ํํํ๊ธฐ ์ํ ๊ท์น์ ์ ์ ์๋ค.
- ๋ฐฐ์ด๋ช ํ๊ธฐ
- ๋ฐฐ์ด๋ช ์ index๋ฅผ ๋ํจ
- ๊ดํธ๋ก ๋ฌถ์ ํ ํฌ์ธํฐ ์ฐ์ฐ์ ๋ถ์.
- ์ฃผ์๋ผ๋ฉด ํฌ์ธํฐ ์ฐ์ฐ์ ๋ถ์ด์ง ์์๋ ๋จ.
ํฌ์ธํฐ ๋ฐฐ์ด๊ณผ ๋ฐฐ์ด ํฌ์ธํฐ
์ผ๋ฐ์ ์ผ๋ก `int **p`๋ `int *` ํ์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋ณ์์ด๋ค. ์ด ๋ฟ๋ง ์๋๋ผ ํฌ์ธํฐ ๋ฐฐ์ด๊ณผ ๋ฐฐ์ด ํฌ์ธํฐ๋ ์์ผ๋ฉฐ ์ด๋ฅผ ์ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
- `int *p[5]` : `int * `์ ๊ฐ์ง๋ ์ฌ์ด์ฆ 5์ ๋ฐฐ์ด์ด๋ค.
- `(int (*p)[5];` : ?ํ 5์ด์ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด ํฌ์ธํฐ์ด๋ค.
#include <stdio.h>
int main() {
char *test1[] = {1, 2, 3, 4};
char test2[][8] = {"TEST", "TEST", "TEST", "TEST"}
}
์์ ์ ์ฝ๋์์ `*test1`์ ์ธ์๋ก ์ ๋ฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? `test1`์ `char *` ํ์ ์ 4๊ฐ์ง๋ฆฌ ๋ฐฐ์ด์ด๋ค. ๋ฐ๋ผ์ `**p`์ ๊ฐ์ด ๋๋ธ ํฌ์ธํธ๋ก ์ธ์๋ฅผ ๋ฐ์์ผ ํ๋ค. ์ด์ ๋ฌ๋ฆฌ `test2[][8]`์ ๊ฒฝ์ฐ `char (*p)[8]`์ผ๋ก ์ธ์๋ฅผ ๋ฐ๋๋ค. ์ฆ ์์ ์ฃผ์์ ๋ฐฐ์ด ํฌ๊ธฐ๋งํผ์ ์๋ฏธํ๋ค.
ํจ์ ํฌ์ธํฐ
ํจ์ ํฌ์ธํฐ๋ ์ด๋ ต๊ฒ ์๊ฐํ ํ์๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด `int test(int x)`๋ผ๋ ํจ์๊ฐ ์๋ค๋ฉด ์ด๋ฅผ ๋ฐ๊ธฐ ์ํ ํจ์ ํฌ์ธํฐ๋ `int (*test) (int)`๊ฐ ๋๋ค. ์ฆ return type๊ณผ ์ธ์๋ ๊ทธ๋๋ก ๋ด๋ ค์ค๊ณ ํจ์ ์ฃผ์๋ฅผ ๋ฐ์ ์ ์๋ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ ๊ฒ์ด๋ค.
#include <stdio.h>
int plus(int, int);
int minus(int, int);
int multi(int, int);
int main() {
int (*fp[4])(int, int) = {plus, minus, multi};
}
์์ ๊ฐ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ์ฌ, `fp[i](num1, num2)`์ ๊ฐ์ ์ฐ์ฐ์ ํตํด ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ํจ์๋ฅผ ํธ์ถํ๊ฒ ํ ์ ์๋ค. ์ด ๋ฟ๋ง ์๋๋ผ ํจ์ ์์ฒด๋ฅผ ์ธ์๋ก ์ค ์ ์์ผ๋ฉฐ ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
void ํฌ์ธํฐ
๊ฐ๋ฆฌํค๋ ๋์์ฒด์ type ์ ํ์ด ์๋ ํฌ์ธํฐ๋ค. ์๋ฅผ ๋ค์ด `void *p`๋ฅผ ์ ์ธํ๋ค๋ฉด ์ด๋ค ํ์ ์ด๊ฑด ํฌ์ธํ ํ ์ ์๋ค. ์ด๋ Generic ์ฝ๋ฉ์ ๊ทผ๋ณธ์ด ๋๋ฏ๋ก ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ฐ์ `void *`๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค ํด๋ ์ด๋ฏธ `void *`์ ์ฑ์ง์ ์ดํดํ๊ณ ์๋ค. ์๋ํ๋ฉด ํ ๋ณํ์ ์ดํดํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด `int *test = (int *)malloc(sizeof(int));`๋ฅผ ์คํํ ๋ `(int *)`๋ก ํ ๋ณํ์ ํด์ค๋ค. ์ด๋ `malloc`์ ๋ฐํ์ `void *` ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ ๋์ ์ฐ์ฐ์์์ ์ข์ฐ์ธก ํ์ด ์ผ์นํ์ฌ์ผ ์ํ ๊ฐ๋ฅํ๋ค. ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก void ํฌ์ธํฐ๋ฅผ ํตํด ์๋ฃํ์ ๊ฐ๋ฆฌํจ๋ค๋ฉด `*((int *)p`์ ๊ฐ์ด ํ ๋ณํ์ ์ํํ์ฌ์ผ ํ๋ค.
'๐โโ๏ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C: ๋์ ํ ๋น๊ณผ ํ์ฉ (0) | 2020.11.20 |
---|---|
C: Generic Coding (0) | 2020.11.18 |
C: ์ ์์ ๋ฒ์ (0) | 2020.11.16 |
C: ํํ์ (0) | 2020.11.14 |
C: ์ ์ธ๊ณผ ์ด๊ธฐํ (0) | 2020.11.14 |