PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2006/06/26 22:43:58
Name tsana
Subject C에 대한 질문~
음;; 일단 질문 내용은 포인터에 대한 것입니다. 아래 소스코드가 문제이구요
#include <stdio.h>
#include <string.h>

char *tmp_name(void){
        char name[5];
        static int seq=0;
        ++seq;;
        strcpy(name,"tmp");
        name[3] = '0'+seq;
        name[4] = '\0';

        return name;
}
void main (void){
        printf("name : %s\n",tmp_name());
}
위 코드를 실행시키면 원래 tmp1이 출력되어야 하는데 글자가 깨지는 이유를 설명하라.
는 문제인데요.
답은 함수를 호출하고 함수의 값을 반환하면 함수에서 사용했던 메모리에 내용이 지워지기 때문에 포인터는 반환되지만 내용이 지워져 글자가 깨어진다 라고 되어 있었습니다. 이걸 막기위해 함수에서 name[]을 선언할 때 static을 사용하는 방법이 있다고 되어있더군요.

이때 궁금한 점은 바로 아래 소스입니다.
#include <stdio.h>
#include <string.h>

char *tmp_name(void){
        char name[5];
        static int seq=0;
        ++seq;;
        strcpy(name,"tmp");
        name[3] = '0'+seq;
        name[4] = '\0';

        return name;
}

void main (void){
        char name[5];
        char *p;
        p = tmp_name();
        name[0] = *p;
        name[1] = *(p+1);
        name[2] = *(p+2);
        name[3] = *(p+3);
        name[4] = '\0';
        printf("name : %s\n",name);
}
위 소스는 제가 나름대로 문제를 풀려고 한 것인데요, 메인안에 포인터 하나를 만들고 함수의 반환값을 집어넣습니다. 그리고 적절히(-_-) 조합해서 메인안에 선언한 새 배열 name을 만들어 냅니다. 답대로라면 포인터p는 주소를 제대로 받지만 내용은 이미 지워진 상태여야 합니다. 그래서 위처럼 적절히 조합해도 결과값은 제대로 나오지 않아야하는데… 깨끗하게 나오더군요;;

제가 무얼 잘못 알고 있는 것이 있나요? 가르쳐 주세요~

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
Dark-probe
06/06/26 23:12
수정 아이콘
tmp_name()이 반환해야 하는 문자열이
삭제되기 직전에 p 에 저장됩니다.
그러나 어쨌거나 결국은 삭제되어야 하는 문자열이므로
p 에 담긴 내용은 제어가 그 scope에 있는 동안만 유효합니다.
printf() 나 다른 함수로 넘어간다거나 하면 완전히 삭제되는 거죠.

이렇게 임시적으로 데이터 삭제를 지연시키는 이유는
프로그램에 약간의 유연성을 주기 위함으로 보입니다만,
그 작동과정을 알아보려면 컴파일러 수준으로 내려가야 답이 나옵니다.
다시 말해 이 작업은 컴파일러에 따라 다를 수 있으므로,
결과가 보장되지 않은 위험한 방법이라는 뜻입니다.

아마 결과는 나왔어도 컴파일러에서 분명 경고가 떴을 겁니다.
만약 경고가 안떴다면 워닝레벨을 좀 높여두시는게 좋습니다.
Dark-probe
06/06/26 23:14
수정 아이콘
안전성을 보장받기 위해서는 다음처럼
저장장소를 매개변수로 제공해 주는 것이 옳습니다.
실제로 표준 라이브러리의 문자열 함수들은 모두 다음 방식을 사용합니다.

void get_name(char *ret)

static int seq=0;
++seq;;
strcpy(ret, "tmp");
ret[3] = '0'+seq;
ret[4] = '\0';
06/06/26 23:16
수정 아이콘
Dark-probe님// 감사합니다~. 그러니까 제가 지금 쓰는 컴파일러에서는 다른 함수로 넘어가기 전까지 저장되어 있을수 있다는 거지만 원래는 지워지는게 맞다는 거죠? 그리고 밑에 적절한 사용법 감사합니다~
06/06/27 15:56
수정 아이콘
지역 변수는 스택에 할당되고, 함수가 리턴 값을 반환하고 마친 후에
모든 메모리는 삭제됩니다. 결국 저런 문제는 변수의 life time과 scope 문제이죠
그래서 저런 데이터를 유지하기 위해서는 힙(heap)영역에 변수를 할당해야 합니다.

두번째 문제에서 아무런 오류가 없어 보이는 것은 결론적으로는 위험성을 안고 있는 것입니다.
글쓰신 분이 사용하는 컴파일러는 유연함을 제공하는 컴파일러가 아니라
오히려 위험성을 안고 있는 컴파일러이죠
위와 같은 문법이 가지고 있는 잠재적 오류를 정확하게 잡아 주지 못해서
당장은 잘 돌아가는 프로그램처럼 보이지만, 결국엔 더 큰 문제를 일으킬 가능성을 언제나 갖고 있다는 겁니다.
해제된 메모리에 원래 데이터가 남아있다는 것은 보안상으로도 매우 안 좋습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
18305 게임에서 미치는 장비의 영향성 [9] 마이스타일2096 06/06/27 2096
18304 삼국지 게임 해보신 분들께... [10] 넘팽이2136 06/06/26 2136
18303 유기el 에 대해 질문이 있습니다. [3] 군용건빵1561 06/06/26 1561
18302 요즘 스타 1:1 신청할만한 채널이 없나요? [4] 이뤄보자사장1990 06/06/26 1990
18301 C에 대한 질문~ [4] tsana1572 06/06/26 1572
18300 일정한 시간 간격으로 알람해주는 시계 구합니다. [1] newromancer2235 06/06/26 2235
18293 VDSL모뎀인식 관련해서요. 콜라박지호1549 06/06/26 1549
18292 오늘 엠겜 더루키에 어느선수들 나왔죠? [1] khw7111573 06/06/26 1573
18291 간단한 영문법 질문 드립니다. [7] 에프마린1653 06/06/26 1653
18289 논설문과 수필에 대한 질문입니다. [1] MayBee1861 06/06/26 1861
18288 네덜란드vs포르투갈 하이라이드 영상 볼 수 있는 곳 있나요? [2] jyl9kr1647 06/06/26 1647
18287 핸드폰 번호이동 질문 [2] 훗-_,-1786 06/06/26 1786
18285 핸드폰질문요 [2] 장승용1548 06/06/26 1548
18284 반지 빼기.. [4] .JunE.3029 06/06/26 3029
18283 여러분들이라면!(mp3 선택 질문) [9] 히로2090 06/06/26 2090
18282 토익책 뭐가 좋을까요? [3] 권태1765 06/06/26 1765
18281 대학교 학점관련 질문이요 [4] 피플와인1686 06/06/26 1686
18280 여러분들은 메신저에 등록된 친구가 몇명이세요? [19] possible2359 06/06/26 2359
18279 클럽박스 질문~추가로서바이버리그질문 [2] Hustla_Homie1815 06/06/26 1815
18278 스타리그관련~ 보람1574 06/06/26 1574
18277 컴활2급 실기에 관한 질문입니다. [4] 연성연승™1565 06/06/26 1565
18276 하드에 관해서 다시 질문 [2] FlyHigh~!!!1662 06/06/26 1662
18274 노트북 질문 [1] 즐거운하루1840 06/06/26 1840
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로