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

728x90
๋ฐ˜์‘ํ˜•
๋ ‰ํ† ํ”ผ์•„ ์ •ํ˜œ๊ฒฝ ๊ฐ•์‚ฌ๋‹˜์˜ 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;

 ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ `p3p2p1→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`์™€ ๊ฐ™์ด ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€