const, static 키워드
글쓴이: 하하 / 작성시간: 월, 2003/09/15 - 6:14오후
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]
Forums:
Num2Asc 의 리턴값은 const char * 인데buf 는 ch
Num2Asc 의 리턴값은 const char * 인데
buf 는 char * 이니까 에러가 납니다.
따라서 buf를 const char *로 선언해주시거나 강제로 타입캐스팅해주시면 되는데... 이왕이면 전자로 처리하시는 것이 좋겠지요
:? 음.. char 포인터값은 변경될 수 있지만 포인터가 가리키고 있는 실제 char값은 변경할 수 없다.. 가 맞습니다.
즉 const char * 로 선언된 변수는 어떤 포인터 값도 저장할 수 있지만 그 내용을 변경하려고 하면 세그먼트 폴트가 나겠지요.
Re: 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 * 형 변수에 넣어 참조하는 것이 바람직합니다.
이렇게 사용하는 것이 좋겠군요. 원래 제시하신 코드는 memory leak이 생기는 코드입니다.
---
http://coolengineer.com
댓글 달기