const, static 키워드

하하의 이미지

const 상수를 나타낸다.
static 함수 호출 시 메모리에 올라와 호출한 함수가 리턴되어도
그값이 메모리에 남아 있는다.

이게 제가 알고 있는 const, static 이란 넘입니다.

그런데 실제 사용하는 걸 보면.. 예를 들어..

static const char *table_n2a =
    "000\0" "001\0" "002\0" "003\0" "004\0" "005\0" "006\0" "007\0" "008\0" "009\0"
    "010\0" "011\0" "012\0" "013\0" "014\0" "015\0" "016\0" "017\0" "018\0" "019\0"
    "020\0" "021\0" "022\0" "023\0" "024\0" "025\0" "026\0" "027\0" "028\0" "029\0"
    "030\0" "031\0" "032\0" "033\0" "034\0" "035\0" "036\0" "037\0" "038\0" "039\0"
    "040\0" "041\0" "042\0" "043\0" "044\0" "045\0" "046\0" "047\0" "048\0" "049\0"
    "050\0" "051\0" "052\0" "053\0" "054\0" "055\0" "056\0" "057\0" "058\0" "059\0"
    "060\0" "061\0" "062\0" "063\0" "064\0" "065\0" "066\0" "067\0" "068\0" "069\0"
    "070\0" "071\0" "072\0" "073\0" "074\0" "075\0" "076\0" "077\0" "078\0" "079\0"
    "080\0" "081\0" "082\0" "083\0" "084\0" "085\0" "086\0" "087\0" "088\0" "089\0"
    "090\0" "091\0" "092\0" "093\0" "094\0" "095\0" "096\0" "097\0" "098\0" "099\0"
    "100\0" "101\0" "102\0" "103\0" "104\0" "105\0" "106\0" "107\0" "108\0" "109\0"
    "110\0" "111\0" "112\0" "113\0" "114\0" "115\0" "116\0" "117\0" "118\0" "119\0"
    "120\0" "121\0" "122\0" "123\0" "124\0" "125\0" "126\0" "127\0" "128\0" "129\0"
    "130\0" "131\0" "132\0" "133\0" "134\0" "135\0" "136\0" "137\0" "138\0" "139\0"
    "140\0" "141\0" "142\0" "143\0" "144\0" "145\0" "146\0" "147\0" "148\0" "149\0"
    "150\0" "151\0" "152\0" "153\0" "154\0" "155\0" "156\0" "157\0" "158\0" "159\0"
    "160\0" "161\0" "162\0" "163\0" "164\0" "165\0" "166\0" "167\0" "168\0" "169\0"
    "170\0" "171\0" "172\0" "173\0" "174\0" "175\0" "176\0" "177\0" "178\0" "179\0"
    "180\0" "181\0" "182\0" "183\0" "184\0" "185\0" "186\0" "187\0" "188\0" "189\0"
    "190\0" "191\0" "192\0" "193\0" "194\0" "195\0" "196\0" "197\0" "198\0" "199\0"
    "200\0" "201\0" "202\0" "203\0" "204\0" "205\0" "206\0" "207\0" "208\0" "209\0"
    "210\0" "211\0" "212\0" "213\0" "214\0" "215\0" "216\0" "217\0" "218\0" "219\0"
    "220\0" "221\0" "222\0" "223\0" "224\0" "225\0" "226\0" "227\0" "228\0" "229\0"
    "230\0" "231\0" "232\0" "233\0" "234\0" "235\0" "236\0" "237\0" "238\0" "239\0"
    "240\0" "241\0" "242\0" "243\0" "244\0" "245\0" "246\0" "247\0" "248\0" "249\0"
    "250\0" "251\0" "252\0" "253\0" "254\0" "255\0" ;

const char *Num2Asc( int c )
{
   return table_n2a + ( c << 2 ) ;
}


main()
{
        int   i=10;
        char  *buf;

        buf = (char *)malloc(10);

        memset(buf, 0x00, 10);

        buf = Num2Asc(i);

        printf(" %s ", buf);

}

이런 코드를 보면 이건 itoa 함수 인데 저 앞글중에 올라온 코드를 가져온것입니다.

main 부분이 제가 그 itoa 함수를 사용하는 부분인데..

컴파일을 하면

warning: assignment discards qualifiers from pointer target type

이런 메세지가 뜹니다.

생각 해 보건데....

const char *Num2Asc( int c ) <= 요 함수의 리턴형이

const char * 즉 리턴형의 char형 주소가 바뀔수 없다. 이렇게

되어있는데 main에서 malloc을 통하여 리턴 받을 변수의 주소가

할당되고 넘겨주려는 함수의 리턴주소는 이미 있고 그러니 서로 안

맞아 warning이 떨어진건 아닌지 생각이 들지만... 아래와 같이...

     buf = (char *)malloc(10);

        memset(buf, 0x00, 10);

        buf = Num2Asc(i);

1. 무엇이 잘 못 된건가요?

2. const 와 static 이 실제 응용에서 어떻식으로 쓰이는지 알려주세요.. ^^.....

감사합니다..

[/code]

dk의 이미지

Num2Asc 의 리턴값은 const char * 인데
buf 는 char * 이니까 에러가 납니다.

따라서 buf를 const char *로 선언해주시거나 강제로 타입캐스팅해주시면 되는데... 이왕이면 전자로 처리하시는 것이 좋겠지요

Quote:
const char * 즉 리턴형의 char형 주소가 바뀔수 없다.

:? 음.. char 포인터값은 변경될 수 있지만 포인터가 가리키고 있는 실제 char값은 변경할 수 없다.. 가 맞습니다.
즉 const char * 로 선언된 변수는 어떤 포인터 값도 저장할 수 있지만 그 내용을 변경하려고 하면 세그먼트 폴트가 나겠지요.

#include <stdio.h>

int main()
{
  const char *str1="First";
  const char * const str2="Second";


  printf("str1 == %s\n", str1);
  str1=str2;
  printf("str1 == %s\n", str1);
#if 0
  str2="Third";
#endif

  return 0;
}
pynoos의 이미지

하하 wrote:

static const char *table_n2a =
    "000\0" ........;

const char *Num2Asc( int c )
{
   return table_n2a + ( c << 2 ) ;
}


main()
{
        int   i=10;
        char  *buf;

        buf = (char *)malloc(10);

        memset(buf, 0x00, 10);

        buf = Num2Asc(i);

        printf(" %s ", buf);

}

이런 코드를 보면 이건 itoa 함수 인데 저 앞글중에 올라온 코드를 가져온것입니다.

main 부분이 제가 그 itoa 함수를 사용하는 부분인데..

컴파일을 하면

warning: assignment discards qualifiers from pointer target type

이런 메세지가 뜹니다.

1. 무엇이 잘 못 된건가요?

2. const 와 static 이 실제 응용에서 어떻식으로 쓰이는지 알려주세요.. ^^.....

감사합니다..

static const char * table_n2a 의 의미는 table_n2a 가 가리키는 것의 속성이 const 이며, table_n2a 는 프로그램의 data 영역에(stack이 아닌) 생성하라는 뜻입니다.

const char * a;
char const * a;
는 같은 표현이며 서로 바꿔 쓸 수가 있으며 * 를 수식하여 a가 가리키는 곳이 const 형 char 임을 나타냅니다.

char * const a;

는 위와는 달리 a 값자체는 바뀔 수 없으나 a 가 가리키는 값은 바뀔 수 있음을 나타냅니다.

const char * const a;

는 a 값도, a 가 가리키는 값도 바뀔 수 없음을 나타냅니다.

static 이 붙을 때는 * 와는 상관없이 맨 뒤의 변수에 대해 꾸미는 것이며,
함수 안에서는 그 변수의 생성위치가 스택이 아닌 data 영역에 잡히는 것이고,
함수 밖에서는 data 영역에 잡히되 scope를 그 파일로만 한정한다는 의미가 됩니다.

위의 warning은

Num2Asc 의 return type인 const char * 를 buf 의 type인 char *에 대입하는 충돌에서 나온 것입니다.

const char * = char * ;
의 대입은 성립하나

char * = const char *;
의 대입은 성립하지 않지요.

사용되는 예로서, Num2Asc 같이 static const * 변수를 return 값으로 돌리는 경우 (즉, const * argument 를 return으로 반환하는 경우가 아닌)는 const char * 를 return 값으로 하는 것이 좋은 구현이며,
사용하는 쪽에서는 복사해서 사용하거나 const * 형 변수에 넣어 참조하는 것이 바람직합니다.

main() 
{ 
        int   i=10; 
        const char  *buf; 

        buf = Num2Asc(i); 

        printf(" %s ", buf); 

}

이렇게 사용하는 것이 좋겠군요. 원래 제시하신 코드는 memory leak이 생기는 코드입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.